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