安装
您可以通过 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();
复制代码
参考文档
文档