The installation
You can install packages using Composer:
composer require spatie/laravel-permission
Copy the code
Add service provider to config/app.php file:
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
Copy the code
Release the migration
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
Copy the code
Migrate build tables
php artisan migrate
Copy the code
Roles role table
Permissions permission table
Role_has_permissions Role permission table
Model_has_roles User role table that users can use based on roles
Model_has-permissions User permission table. Users directly obtain permissions for use
Publishing configuration files
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
Copy the code
configuration
config/permission.php
If you customize the role and Permission models, You need to inherit Spatie\Permission\Models\Permission and Spatie\Permission\Models\Role respectively, and modify the configuration files models.role and models.permisssion
return [
'models'When using the HasRoles feature in this package, we need to know which Eloquent model to use to obtain your permissions. Of course, it's usually just the "Permission" model, but you can use any model you like. * * The Permission model you use must implement the Spatie\Permission\Contracts. */'permission'=> App\Models\Permission::class, /* * When using the HasRoles feature in this package, * we need to know which Eloquent model to use to retrieve your roles. Of course, it's usually just a "Role" model, but you can use any model you like. * * The Permission model you use must implement the Spatie\Permission\Contracts\Role. * /'role' => \App\Models\Role::class,
],
....
]
Copy the code
Models/role.php
use Spatie\Permission\Models\Role as SpatieRole;
class Role extends SpatieRole
{
}
Copy the code
Models/permission.php
use Spatie\Permission\Models\Permission as SpatiePermission;
class Permission extends SpatiePermission
{
}
Copy the code
Add Spatie\Permission\Traits\HasRoles to your User model:
class User extends Authenticatable
{
use HasRoles;
// ...
}
Copy the code
Permission to verify
Middleware/VerifyPermissions.php
Creating middleware
public function handle($request, Closure $next)
{
$route = $request->decodedPath();
$user = $request->user();
if (!$user->hasPermissionTo($route)) {
return response()->json([
'code'= > 1001,'message'= >"No authority",], 401); };return $next($request);
}
Copy the code
Register routing middleware
protected $routeMiddleware= [...'role' => \App\Http\Middleware\VerifyPermissions::class
];
Copy the code
Routing using middleware
Route::middleware('role')->group(function() {});Copy the code
Reference code
Adding Role Rights
public function addRoleAndPermissions($data)
{
$role = Role::create(['name'= >$data['name']]);
$permissionNames = $this->permissionModel->getPermissionColumn('name');
foreach ($data['permissions'] as $permission) {
if (in_array($permission.$permissionNames)) {
$role->givePermissionTo($permission);
} else {
$permission = Permission::create(['name'= >$permission]);
$role->givePermissionTo($permission); }}}Copy the code
Add multiple role permissions
public function updateRolesAndPermissions($datas)
{
foreach ($datas as $roleId= >$permissions) {
$this->addNotExistPermission($permissions);
$role = Role::findById($roleId);
$rolePermissionNames = array_column($role->permissions()->get()->toArray(), 'name');
$addRolePermissions = array_diff($permissions.$rolePermissionNames);
$delRolePermissions = array_diff($rolePermissionNames.$permissions);
$role->givePermissionTo($addRolePermissions);
$role->revokePermissionTo($delRolePermissions);
}
}
public function addNotExistPermission($permissions)
{
$permissionNames = $this->permissionModel->getPermissionColumn('name');
$addPermissions = array_diff($permissions.$permissionNames);
foreach ($addPermissions as $permission) {
Permission::create(['name'= >$permission]); }}Copy the code
Adding a Role
$user = $this->userModel::where('name'.$userData['name'])->first();
$user->assignRole($roleId);
Copy the code
Gets the role of the user
$role = $user->getRoleNames();
Copy the code
Reference documentation
The document