Laravel——使用者角色許可權控制包 Laravel-permission

Ctrl_C發表於2019-04-18

安裝

您可以通過 composer 安裝軟體包:

composer require spatie/laravel-permission
複製程式碼

config/app.php 檔案中新增服務提供者:

'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];
複製程式碼

釋出遷移

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
複製程式碼

遷移生成表

php artisan migrate
複製程式碼

roles 角色表

permissions 許可權表

role_has_permissions 角色許可權表

model_has_roles 使用者角色表,使用者通過角色獲取許可權使用

model_has-permissions 使用者許可權表,使用者直接獲取許可權使用

釋出配置檔案

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
複製程式碼

配置

config/permission.php

如果自定義role和permission模型,需要分別繼承Spatie\Permission\Models\PermissionSpatie\Permission\Models\Role,並修改配置檔案models.role和models.permisssion

return [
    'models' => [
    
        /*
         * 當使用這個包中的 “HasRoles” 特性時,我們需要知道應該
         * 使用哪個 Eloquent 模型來獲取您的許可權。
         * 當然,它通常只是“許可權(Permission)”模型,你也可以使用任何你喜歡的模型。
         * 
         * 您使用的許可權模型必須實現
         *  `Spatie\Permission\Contracts\Permission` 契約。
         */
    
        'permission' => \App\Models\Permission::class,
    
        /*
         * 當使用這個包中的 “HasRoles” 特性時,
         * 我們需要知道應該使用哪個 Eloquent 模型來檢索你的角色。
         * 當然,它通常只是 “角色(Role)” 模型,你也可以使用任何你喜歡的模型。
         *
         * 您使用的許可權模型必須實現
         * `Spatie\Permission\Contracts\Role` 契約。
         */
    
        'role' => \App\Models\Role::class,
    
    ],
    
    ....
]
複製程式碼

Models/role.php

use Spatie\Permission\Models\Role as SpatieRole;

class Role extends SpatieRole
{
}
複製程式碼

Models/permission.php

use Spatie\Permission\Models\Permission as SpatiePermission;

class Permission extends SpatiePermission
{
}
複製程式碼

將 Spatie\Permission\Traits\HasRoles 特徵新增到您的 User 模型中:

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
複製程式碼

許可權驗證

Middleware/VerifyPermissions.php

建立中介軟體

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);
}
複製程式碼

註冊路由中介軟體

protected $routeMiddleware = [
        ...
        'role' => \App\Http\Middleware\VerifyPermissions::class
    ];
複製程式碼

路由使用中介軟體

Route::middleware('role')->group(function () {

});
複製程式碼

參考程式碼

新增角色許可權

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);
        }
    }
}
複製程式碼

新增多個角色許可權

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]);
    }
}
複製程式碼

使用者新增角色

$user = $this->userModel::where('name', $userData['name'])->first();
$user->assignRole($roleId);
複製程式碼

獲取使用者的角色

$role = $user->getRoleNames();
複製程式碼

參考文件

文件

相關文章