安裝
您可以通過 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\Permission
和Spatie\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();
複製程式碼