2

I am totally new in laravel. I install laravel 5.2 . I have done with CRUD in laravel. Now i want to integrate laravel authentication package. so i choose zizaco\entrust.

I follow each steps from doc link. but i don't understand what is wrong. In doc there is not mentioned that in which file i have to add following code.

$owner = new Role();
$owner->name         = 'owner';
$owner->display_name = 'Project Owner'; // optional
$owner->description  = 'User is the owner of a given project'; // optional
$owner->save();

$admin = new Role();
$admin->name         = 'admin';
$admin->display_name = 'User Administrator'; // optional
$admin->description  = 'User is allowed to manage and edit other users'; // optional
$admin->save();

and other below code in document.

Even

class User extends Model implements AuthenticatableContract,
                                    AuthorizableContract,
                                    CanResetPasswordContract

Not mentioned about implements class.

i do

use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

but i got error

Trait 'App\Authenticatable' not found

New learner can't get where to place code. i search alot but i can't get perfect document which give right direction.

Where to create role,permissions? Anyone please help me.

Dhara
  • 1,431
  • 4
  • 29
  • 47

3 Answers3

11
  1.Install "zizaco/entrust": "5.2.x-dev"
     2.add provider and aliases in app.php
     3.php artisan vendor:publish
     4.php artisan migrate

Now add in user.php

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Zizaco\Entrust\Traits\EntrustUserTrait;


class User extends Model implements AuthenticatableContract, CanResetPasswordContract
{
    use Authenticatable, CanResetPassword, EntrustUserTrait;
}

Next Create a model for Role

 use Zizaco\Entrust\EntrustRole
        class Role extends EntrustRole
        {
            protected $table = 'roles';
            protected $fillable = ['name', 'display_name', 'description']
        }

Now create a model for permmission

use Zizaco\Entrust\EntrustPermission;

class Permission extends EntrustPermission
{
protected $table = 'permissions';
    protected $fillable = ['name', 'display_name', 'description'];
}

Now create a seeding table for roles and permissions

UserTableSeeder.php
    <?php
    use Illuminate\Database\Seeder;
    use App\Permission;
    use App\Role;
    use App\User;
    class UserTableSeeder extends seeder
    {
        public function run()
        {
            Permission::truncate();
            Role::truncate();
            User::truncate();
            \DB::table('role_user')->delete();
            \DB::table('permission_role')->delete();
//create a user          
  $veeru = User::create([
                'name' => 'veeru',
                'email' => 'something@something.com',
                'password' => bcrypt('qwerty'),
            ]);

    //create a role of admin
            $admin = Role::create([
                'name' => 'admin',
                'display_name' => 'Admin',
                'description' => 'Only one and only admin',
            ]);
//create a permission for role
            $manage_users = Permission::create([
                'name' => 'manage-users-roles-and-permissions',
                'display_name' => 'Manage Users,Roles and Permissions',
                'description' => 'Can manage users,roles and permission"s',
            ]);
    //here attaching permission for admin role
            $admin->attachPermission($manage_users);
//here attaching role for user
            $veeru->attachRole($admin);

    //here iam creating another role and permisssion
            $application = Role::create([
                'name' => 'appapirequestlogs',
                'display_name' => 'AppApiRequestLogs',
                'description' => 'This has full control on Application Core Request logs',
            ]);
            $corereq = Permission::create([
                'name' => 'appapireqlogindex',
                'display_name' => 'AppApiReqLogIndex',
                'description' => 'This has control on Application Core Request Logs index only',
            ]);
    here attaching roles and permissions
            $application->attachPermission($corereq);
            $veeru->attachRole($application);
    }

After seeding that create a routes file and controller for roles and permissions

routes.php

Route::group(['middleware' => 'web'], function () {
    Route::group(['prefix' => 'admin'], function () {
        Route::controller('roles', 'RolesController');
        Route::controller('permissions', 'PermissionsController');
        Route::controller('users', 'UsersController');
    });
});

RolesController.php

use App\Permission;
use App\Role;
use Illuminate\Http\Request;
use App\Http\Requests;

class RolesController extends Controller
{
    function __construct()
    {
        $this->middleware('auth');
        $this->middleware('role:admin');
        $this->middleware('permission:manage-users-roles-and-permissions');
    }

    public function getIndex(Request $request)
    {
        $roles = Role::with('perms')->get();
        return view('roles.index', ['roles' => $roles]);
    }

    public function getCreate()
    {
        return view('roles.create');
    }

    public function postCreate(Request $request)
    {
        $role = Role::create([
            'name' => $request->name,
            'display_name' => $request->display_name,
            'description' => $request->description
        ]);
        return redirect()->to('admin/roles/index');
    }

    public function getUpdate($id)
    {
        $role = Role::findOrFail($id);
        return view('roles.update', ['role' => $role]);
    }

    public function postUpdate(Request $request)
    {
        $role = Role::findOrFail($request->get('id'));
        $role->name = $request->get('name');
        $role->display_name = $request->get('display_name');
        $role->description = $request->get('description');
        $role->save();
        return redirect();
    }

    public function getDelete($id)
    {
        $role = Role::findOrFail($id);
        $role->delete();

        return redirect();
    }

    public function getAttach(Request $request)
    {
        $role = Role::where('id', '=', $request->id)->with('perms')->first();
        $permissions_id = $role->perms->pluck('id')->toArray();
        $permissionsNotAttached = Permission::whereNotIn('id', $permissions_id)->get();
        return view('roles.attach', compact('role', 'permissionsNotAttached'));
    }

    public function postAttach(Request $request)
    {
        $role = Role::findOrFail($request->id);
        $permission = Permission::findOrFail($request->permission);
        $role->attachPermission($permission);
        return redirect();
    }

    public function getDetach(Request $request)
    {
        $role = Role::findOrFail($request->role_id);
        $permission = Permission::findOrFail($request->permission_id);
        $role->detachPermission($permission);
        return redirect()->to('/admin/roles/index');

    }
}

Similarly create PermissionsController.php

use App\Http\Requests\PermissionRequest;
use App\Permission;
use App\Http\Requests;


class PermissionsController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('role:admin');
        $this->middleware('permission:manage-users-roles-and-permissions');
    }

    public function getIndex()
    {
        $permissions = Permission::all();
        return view('permissions.index', ['permissions' => $permissions]);
    }

    public function getCreate()
    {
        return view('permissions.create');
    }

    public function postCreate(Request $request)
    {
        $permission = Permission::create([
            'name' => $request->name,
            'display_name' => $request->display_name,
            'description' => $request->description
        ]);

        return redirect();
    }

    public function getUpdate($id)
    {
        $permission = Permission::findOrFail($id);
        return view('permissions.update', ['permission' => $permission]);
    }

    public function postUpdate(Request $request)
    {
        $permission = Permission::findOrFail($request->get('id'));
        $permission->name = $request->get('name');
        $permission->display_name = $request->get('display_name');
        $permission->description = $request->get('description');
        $permission->save();
        return redirect();
    }

    public function getDelete($id)
    {
        $permission = Permission::findOrFail($id);
        $permission->delete();
        return redirect();
    }


}
Veerendra Borra
  • 1,286
  • 14
  • 24
4

After Creating first given process

create roles middleware example CheckRole

<?php

namespace App\Http\Middleware;


use Closure;

class CheckRole
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @param $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {


        if (\Auth::user()->hasRole($role)) {

            return $next($request);
        } else {
            return response()->view('errors.401');
        }
    }
}

now create Check Permission

<?php namespace App\Http\Middleware;

use Closure;

class CheckPermission
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @param $permission
     * @return mixed
     */
    public function handle($request, Closure $next, $permission)
    {
        if (\Auth::user()->can($permission)) {

            return $next($request);
        } else {
            return response()->view('errors.401');
        }
    }
}

add these middlewares in kernal.php

'role' => CheckRole::class,
        'permission' => CheckPermission::class
Veerendra Borra
  • 1,286
  • 14
  • 24
  • thanks @Veerendra for your kind help. this is what i exactly want. i couldn't find anywhere this detailed information. For new learner, detail information required which you give me. thanks once again. – Dhara Mar 22 '16 at 13:30
  • if any doubts ask me – Veerendra Borra Mar 22 '16 at 14:09
  • In PermissionsController and RolesController you have render views file. but how to create that files? – Dhara Mar 23 '16 at 05:12
  • return view('roles.index', ['roles' => $roles]); IN your laravel application,there is a folder resources->views. Now create a roles folder in views.In roles folder now create a index.blade.html file.In that u can use $roles variable.use foreach to loop and bind the values.link [] https://laravel.com/docs/5.2/views link[]https://laravel.com/docs/5.2/blade – Veerendra Borra Mar 24 '16 at 04:09
  • you can also use return view('roles.update', compact('role)); – Veerendra Borra Mar 24 '16 at 04:16
  • okay @Veerendra. I am facing another issue. i have one role manager. which have only view permission allowed. he don't have create,update,delete permission. now How can handle this? because another role has all permission. – Dhara Mar 25 '16 at 13:14
0

Now create a role with a name and add permissions to it. example:

1.create a role name festivals.
2.now create multiple permissions for that
   ->fesindex (only forr index viewing)
   ->fesedit  (only for edit and update)
   ->fesadd   (only for adding)
   ->fesdelete (only for deleting)
3.now attach which permissions you want to give to that role festivals
4.if you want a user to see only index page then
    for role festivals attach only fesindex
5.if you want a user to see index and add a new festival then create a new role for him and add fesindex and fes add 

Now created permissions are placed in your controller

 function __construct(FestivalRepository $repo)
    {
        $this->middleware('auth');
        $this->middleware('permission:fesindex', ['only' => 'getFestivals']);
        $this->middleware('permission:fesedit', ['only' => ['getFestival', 'postUpdateFestival']]);
        $this->middleware('permission:fesadd', ['only' => ['getAddFestival', 'postAddFestival']]);
        $this->middleware('permission:fesapprove', ['only' => 'getChangeStatus']);
        $this->middleware('permission:fesdelete', ['only' => 'getDeleteFestival']);

    }

here getFestivals,getAddFestival etc are methods in controller.

Veerendra Borra
  • 1,286
  • 14
  • 24
  • i am working on it. but i don't know what route required? i have given `Route::group(['middleware' => ['auth']], function () { Route::resource('posts', 'PostsController'); });` – Dhara Mar 26 '16 at 05:40
  • Route::group(['middleware' => 'web'], function () { Route::resource('posts', 'PostsController'); } – Veerendra Borra Mar 26 '16 at 05:53
  • ['middleware' => ['web','auth'] or you can use auth in your public function construct method. public function __construct() { $this->middleware('auth'); } – Veerendra Borra Mar 26 '16 at 05:57
  • which version of zizaco you are using – Veerendra Borra Mar 26 '16 at 05:58
  • "zizaco/entrust": "5.2.x-dev" in this version destroy method is not working so you need to use "zizaco/entrust": "1.7.0". – Veerendra Borra Mar 26 '16 at 06:01
  • i am using `"zizaco/entrust": "dev-laravel-5",` and something is going wrong. i add `$this->middleware('permission:can_view',['only'=>'foo']);` in this only foo action can accessable but not create,update,view. right? still i can access other actions – Dhara Mar 26 '16 at 06:02
  • if problem occurs then ping me or change version.problems comes for only delete method because auth.php changed in laravel 5.2 – Veerendra Borra Mar 26 '16 at 06:03
  • Iam telling about roles controller.just try to delete role from roles table – Veerendra Borra Mar 26 '16 at 06:24
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/107394/discussion-between-jazz-and-veerendra-borra). – Dhara Mar 26 '16 at 09:02
  • what is the use of this? ['middleware' => ['web'] – Sam Arul Raj T Apr 26 '16 at 17:09
  • in laravel 5.1 sessions,token,cookies are in $middleware( its a global middleware).but in 5.2 it s stored in $middlewareGroups (its a route middleware).In this it has web and api.if you dont use web,auth is not available,sessions and error are also not available – Veerendra Borra Apr 27 '16 at 04:23