您能夠經過 composer 安裝軟件包:php
composer require spatie/laravel-permission
複製代碼
在 config/app.php
文件中添加服務提供者:laravel
'providers' => [
// ...
Spatie\Permission\PermissionServiceProvider::class,
];
複製代碼
發佈遷移json
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
複製代碼
遷移生成表bash
php artisan migrate
複製代碼
roles
角色表app
permissions
權限表composer
role_has_permissions
角色權限表ide
model_has_roles
用戶角色表,用戶經過角色獲取權限使用ui
model_has-permissions
用戶權限表,用戶直接獲取權限使用this
發佈配置文件spa
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();
複製代碼