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