Laravel Role based permission ACL Tutorial

Today, We want to share with you Laravel Role based permission ACL Tutorial.In this post we will show you laravel user roles and permissions tutorial, hear for Laravel Permissions User Role based access control we will give you demo and example for implement.In this post, we will learn about Laravel Nova Permissions (Roles and Permission based Access Control (ACL)) with an example.

Laravel Role based permission ACL Tutorial

There are the Following The simple About Laravel Role based permission ACL Tutorial Full Information With Example and source code.

As I will cover this Post with live Working example to develop laravel 5.7 user roles and permissions, so the some laravel 5.7 roles and permissions for this example is following below.

Laravel Setting Up

create a new Laravel Application

$ laravel new roles-permissions

Laravel 5.7 Authentication

Authentication scaffolding

$ php artisan make:auth

Models & Migrations

creating the required models and migrations, migrate the database

//creating the required models and migrations
$ php artisan make:model Permission -m
$ php artisan make:model Role -m

//migrate the database
$ php artisan migrate

Permission migration file

set of fields for Roles and Permission based Access Control (ACL)

Schema::create('permissions', function (Blueprint $table) {
    $table->increments('id');
    $table->string('slug'); //edit-posts
    $table->string('name'); // edit posts
    $table->timestamps();
});

Role migration file

set of fields

    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('slug'); //tester-elc
        $table->string('name'); //tester-elc
        $table->timestamps();
    });

Adding pivot tables

create a new migration, pivot table between users and permissions, create a pivot table for users_roles, users_permissions table,

$ php artisan make:migration create_users_permissions_table --create=users_permissions

//pivot table between users and permissions
Schema::table('users_permissions', function (Blueprint $table) {
    $table->integer('user_id')->unsigned();
    $table->integer('permission_id')->unsigned();

 //FOREIGN KEY CONSTRAINTS
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
 
//SETTING THE PRIMARY KEYS
    $table->primary(['user_id','permission_id']);
});

//create a pivot table for users_roles
$ php artisan make:migration create_users_roles_table --create=users_roles

//users_permissions table
Schema::create('users_roles', function (Blueprint $table) {
   $table->integer('user_id')->unsigned();
   $table->integer('role_id')->unsigned();

 //FOREIGN KEY CONSTRAINTS
   $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
   $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

 //SETTING THE PRIMARY KEYS
   $table->primary(['user_id','role_id']);
});

//roles_permissions 
$ php artisan make:migration create_roles_permissions_table --create=roles_permissions

Schema::create('roles_permissions', function (Blueprint $table) {
 $table->integer('role_id')->unsigned();
 $table->integer('permission_id')->unsigned();

 //FOREIGN KEY CONSTRAINTS
 $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
 $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');

 //SETTING THE PRIMARY KEYS
 $table->primary(['role_id','permission_id']);
});

Laravel Migration

$ php artisan migrate

Setting up the relationships

Role.php

//Role.php
public function permissions() {
   return $this->belongsToMany(Permission::class,'roles_permissions');
}

Permission.php

//Permission.php
public function roles() {
   return $this->belongsToMany(Role::class,'roles_permissions');
}

Creating a Trait

Permissions/HasPermissionsTrait.php

belongsToMany(Role::class,'users_roles');

   }

   public function permissions() {
      return $this->belongsToMany(Permission::class,'users_permissions');

   }
}

User hasRole

HasPermissionsTrait.php

public function hasRole( ... $roles ) {
   foreach ($roles as $role) {
      if ($this->roles->contains('slug', $role)) {
         return true;
      }
   }
   return false;
}

$user = $request->user();
dd($user->hasRole('admin','editor'));

Checking Permissions

HasPermissionsTrait.php

protected function hasPermissionTo($permission) {
   return $this->hasPermission($permission);
}

protected function hasPermission($permission) {
   return (bool) $this->permissions->where('slug', $permission->slug)->count();
}

Create a new PermissionsServiceProvider for authorization

$ php artisan make:provider PermissionsServiceProvider

PermissionsServiceProvider.php

//PermissionsServiceProvider.php 
public function boot()
 {
     Permission::get()->map(function($permission){
Gate::define($permission->slug, function($user) use ($permission){
   return $user->hasPermissionTo($permission);
});
     });
 }

HasPermissionsTrait.php

public function hasPermissionThroughRole($permission) {
   foreach ($permission->roles as $role){
      if($this->roles->contains($role)) {
         return true;
      }
   }
   return false;
}

public function hasPermissionTo($permission) {
   return $this->hasPermissionThroughRole($permission) || $this->hasPermission($permission);
}

Giving Permissions

HasPermissionsTrait.php

//HasPermissionsTrait.php
public function givePermissionsTo(... $permissions) {
   $permissions = $this->getAllPermissions($permissions);
   dd($permissions);
   if($permissions === null) {
      return $this;
   }
   $this->permissions()->saveMany($permissions);
   return $this;
}

Deleting Permissions

HasPermissionsTrait.php

//HasPermissionsTrait.php
public function deletePermissions( ... $permissions ) {
   $permissions = $this->getAllPermissions($permissions);
   $this->permissions()->detach($permissions);
   return $this;
}

Add the Seeders

create seeders for permissions, roles & users

$ php artisan make:seeder PermissionTableSeeder
$ php artisan make:seeder RoleTableSeeder
$ php artisan make:seeder UserTableSeeder

UserTableSeeder.php

//UserTableSeeder.php
$tester_role = Role::where('slug','tester')->first();
$agent_role = Role::where('slug', 'agent')->first();
$dev_perm = Permission::where('slug','create-tasks')->first();
$agent_perm = Permission::where('slug','edit-users')->first();

$tester = new User();
$tester->name = 'info Muneer';
$tester->email = '[email protected]';
$tester->password = bcrypt('secret');
$tester->save();
$tester->roles()->attach($tester_role);
$tester->permissions()->attach($dev_perm);


$agent = new User();
$agent->name = 'admin Butt';
$agent->email = '[email protected]';
$agent->password = bcrypt('secret');
$agent->save();
$agent->roles()->attach($agent_role);
$agent->permissions()->attach($agent_perm);

RoleTableSeeder.php

$dev_permission = Permission::where('slug','create-tasks')->first();
$agent_permission = Permission::where('slug', 'edit-users')->first();

//RoleTableSeeder.php
$tester_role = new Role();
$tester_role->slug = 'tester';
$tester_role->name = 'Front-end tester';
$tester_role->save();
$tester_role->permissions()->attach($dev_permission);

$agent_role = new Role();
$agent_role->slug = 'agent';
$agent_role->name = 'Assistant agent';
$agent_role->save();
$agent_role->permissions()->attach($agent_permission);

//PermissionTableSeeder.php

//PermissionTableSeeder.php
$tester_role = Role::where('slug','tester')->first();
$agent_role = Role::where('slug', 'agent')->first();

$projectMake = new Permission();
$projectMake->slug = 'create-tasks';
$projectMake->name = 'Create Tasks';
$projectMake->save();
$projectMake->roles()->attach($tester_role);

$usersEdit = new Permission();
$usersEdit->slug = 'edit-users';
$usersEdit->name = 'Edit Users';
$usersEdit->save();
$usersEdit->roles()->attach($agent_role);

run our migration with the –seed flag.

$ php artisan migrate:refresh --seed

test this out in your routes files

$user = $request->user();
dd($user->hasRole('tester')); 
dd($user->givePermissionsTo('create-tasks')); 
dd($user->can('create-tasks')); 

Setting up the Laravel Custom Blade Directives

PermissionsServiceProvider.php

  Blade::directive('role', function ($role){
   return "check() && auth()->user()->hasRole({$role})) :";
  });
  Blade::directive('endrole', function ($role){
   return "";
  });

Laravel Blade view files

@role('admin')

Hello from the admin

Welcome to Admin Page

@endrole

Setup the Laravel Middleware

$ php artisan make:middleware RoleMiddleware

Laravel Register kernel & setup

public function handle($request, Closure $next, $role, $permission = null)
 {
   if(!$request->user()->hasRole($role)) {
     abort(404);
  }
  if($permission !== null && !$request->user()->can($permission)) {
      abort(404);
  }
     return $next($request);
 }

Laravel Define a routes

Route::group(['middleware' => 'role:admin'], function() {
   Route::get('/admin', function() {
      return 'Welcome To Admin';
   });
});
Angular 6 CRUD Operations Application Tutorials

Read :

Summary

You can also read about AngularJS, ASP.NET, VueJs, PHP.

I hope you get an idea about Laravel Role based permission ACL Tutorial.
I would like to have feedback on my Pakainfo.com blog.
Your valuable feedback, question, or comments about this article are always welcome.
If you enjoyed and liked this post, don’t forget to share.

Leave a Comment