博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Laravel——用户角色权限控制包 Laravel-permission
阅读量:6188 次
发布时间:2019-06-21

本文共 3814 字,大约阅读时间需要 12 分钟。

安装

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

参考文档

转载于:https://juejin.im/post/5cb7dada5188253feb5851e3

你可能感兴趣的文章
剑指 offer set 15 第一个只出现一次的字符
查看>>
[WinAPI] API 14 [获取、设置文件属性和时间]
查看>>
查找路径php.ini文件到底在哪里?
查看>>
JPEG文件格式介绍
查看>>
自动发布工具应该具备的11个标准特征
查看>>
Android 自定义注解之源码注解(RetentionPolicy.SOURCE)
查看>>
nodejs中http连接池复用的问题
查看>>
一步一步SharePoint 2007之十七:解决实现Form认证后无法再用SharePoint Designer编辑网站的问题...
查看>>
约瑟夫环Ruby算法
查看>>
【转】PowerDesigner使用方法小结
查看>>
Error Handling with Exceptions
查看>>
CentOS6.3源码安装mysql5.6.15
查看>>
Node出错导致运行崩溃的解决方案
查看>>
AI需要你帮忙 | 把两栖爬行动物框出来,提高AI识别准确率
查看>>
LeetCode:Anagrams
查看>>
[转]SQL函数——将一对多关系转换成一对一关系
查看>>
[转] 从 dll 程序集中动态加载窗体
查看>>
IP地址,子网掩码,默认网关,路由,形象生动阐述
查看>>
IRQ和FIQ中断的区别【转】
查看>>
工厂模式连接数据库
查看>>