0

0

laravel-permission 角色权限控制【代码详解】

藏色散人

藏色散人

发布时间:2020-06-20 13:33:17

|

9531人浏览过

|

来源于csdn

转载

下面由laravel教程栏目给大家介绍laravel-permission 角色权限控制,希望对需要的朋友有所帮助!

laravel-permission 角色权限控制【代码详解】

首先还是贴出GitHub的地址

https://github.com/spatie/laravel-permission

然后说一下使用心得

先说数据库的表结构把一共有6张表,也可以根据可以喜好添加,修改删除表,不过我们还是先列出表!

首先是用户表(users)不用说了都是一些基本信息包括名字,邮箱什么的!

权限表(permissions)权限表就是存放所有权限的一张表,权限可以是控制器访问权限,接口访问权限,model访问权限,在这里我们只讨论接口访问权限!

角色表(roles)角色表就是存放你所有的角色,角色的名字为索引!

基本的表有了,那他们是怎么关联的呢?请继续往下看!

用户拥有权限表(model_has_permissions)這张表记录的就是user_id,permission_id的多对多的关系表,用户直接获取权限。

用户拥有角色表(model_has_roles)这张表记录的用户拥有的权限,表里有user_id,role_id这个也是记录用户和角色多对多的关系表,也可以理解为中间表!

角色拥有权限表(role_has_permissions)這张表记录的是角色拥有哪些权限,表里就2个字段role_id,permission_id!也可以根据需要进行拓展!

下面给出一张图,来直观的看下各个关联关系:


用户直接拥有权限,model_has_permissions,用户拥有角色那么就是model_has_role然后到roles表中role_has_permission

如何添加角色(依赖包提供了方法)

$role = Role::Create(['name' => 'add_title']);

Create有几个参数呢?原方法中有一个name和guard_name,如下面代码

Amazon Nova
Amazon Nova

亚马逊云科技(AWS)推出的一系列生成式AI基础模型

下载
use Spatie\Permission\Models\Role;
public static function create(array $attributes = [])
{
    $attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');

    if (static::where('name', $attributes['name'])->where('guard_name', $attributes['guard_name'])->first()) {
        throw RoleAlreadyExists::create($attributes['name'], $attributes['guard_name']);
    }

    if (isNotLumen() && app()::VERSION < '5.4') {
        return parent::create($attributes);
    }

    return static::query()->create($attributes);
}

我们也可以不用这个方法,去调用它原有的task也可以,比如项目初始化自带的seeder中就调用task

namespace App\Containers\Authorization\Data\Seeders;
Apiato::call('Authorization@CreateRoleTask', ['admin', 'Administrator', 'Administrator Role', 999,'admin']);

跟着命名空间地址去找就能找到seeder、这个task也在Authorization下面Task里面、可以自己修改Task来符合自己的需求!

如何添加权限(依赖包也提供了方法)

$ permission  =  Permission :: create([ ' name '  =>  ' edit articles ' ]);

跟role一样也可以找到一个写好的Task以及它的create方法!在这里就不过多说了!

如何直接给用户添加权限,删除权限,判断是否有权限

//可以授予任何用户权限:
$ user - > givePermissionTo(' edit articles ');

//你也可以一次给多个权限
$ user - > givePermissionTo( ' edit articles ', ' delete articles ');

//你也可以传递数组
$ user - > givePermissionTo([ ' edit articles ', ' delete articles ' ]);
//权限可以从用户撤销:
$ user - > revokePermissionTo(' edit articles ');
//或者一次性撤消并添加新的权限:
$ user - > syncPermissions([ ' edit articles ',' delete articles ' ]);
//您可以测试用户是否有权限:
$ user - > hasPermissionTo(' edit articles ');
//测试用户有多个权限:
$ user - > hasAnyPermission([ ' edit articles ',' publish articles ',' unpublish articles ' ]);
//您可以使用Laravel的默认can功能测试用户是否具有权限:
$ user - > can(' edit articles ');

如何通过角色使用权限

//角色可以分配给任何用户:
$ user - > assignRole(' writer ');

//你也可以一次赋值多个角色
$ user - > assignRole( ' writer ', ' admin ');
//或者作为一个数组
$ user - > assignRole([ ' writer ', ' admin ' ]);
//角色可以从用户中删除:
$ user - > removeRole(' writer ');
//角色也可以同步:
//所有当前角色将被从用户中删除,而由传入的数组取代
$ user - > syncRoles([ ' writer ', ' admin ' ]);
//您可以确定用户是否具有某个角色:
$ user - > hasRole(' writer ');
//您还可以确定用户是否有任何给定的角色列表:
$ user - > hasAnyRole(Role :: all());
//您还可以确定用户是否具有所有给定的角色列表:
$ user - > hasAllRoles(Role :: all());
//assignRole,hasRole,hasAnyRole,hasAllRoles 和removeRole函数可以接受一个字符串,
//一个\Spatie\Permission\Models\Role对象或一个\Illuminate\Support\Collection对象。

//可以给角色一个许可:
$ role - > givePermissionTo(' edit articles ');
//您可以确定角色是否具有某种权限:
$ role - > hasPermissionTo(' edit articles ');
//权限可以从角色中被撤销:
$ role - > revokePermissionTo(' edit articles ');
//该givePermissionTo和revokePermissionTo函数可以接受字符串或Spatie\Permission\Models\Permission对象。
//权限是从角色自动继承的。另外,个人权限也可以分配给用户。例如:
$ role  =  Role :: findByName(' writer '); 
$ role - > givePermissionTo(' edit articles ');
$ user - > assignRole(' writer ');
$ user - > givePermissionTo(' delete articles ');
//在上面的例子中,角色被授予编辑文章的权限,并且该角色被分配给用户。现在,用户可以编辑文章并删除文章。
//“删除文章”的权限是直接分配给用户的直接权限。
//当我们调用$user->hasDirectPermission('delete articles')它返回true,
//但false对$user->hasDirectPermission('edit articles')。
//如果为应用程序中的角色和用户设置权限并希望限制或更改用户角色的继承权限(即,仅允许更改用户的直接权限),则此方法非常有用。
//您可以列出所有这些权限:
//直接权限
$ user - > getDirectPermissions() //或$ user-> permissions;

//从用户角色继承的权限
$ user - > getPermissionsViaRoles();

//所有适用于用户的权限(继承和直接)
$ user - > getAllPermissions();
//所有这些响应都是Spatie\Permission\Models\Permission对象的集合。
//如果我们按照前面的例子,第一个响应将是一个具有delete article权限的集合,
//第二个响应将是一个具有权限的集合,edit article第三个将包含这两个集合。

在哪儿做限制,在哪儿使用

首先你可以在action中检测这个用户有没有这项权限!

你还可以在request中使用,当用户请求一个接口时、系统会去判断用户是否拥有通过这个接口的权限和角色!

这个request当然要在接口调用方法的时候注入进去!

下面给出位置

namespace App\Containers\Authorization\UI\API\Requests;
/**
 * Define which Roles and/or Permissions has access to this request.
 *
 * @var  array
 */
protected $access = [
    'permissions' => 'add-permission-byRole',
    'roles'       => '',
];

总结:

laravel有几个角色权限控制,但是我选择这个,laravel-permission好搜索、不是因为谁好谁差的!总的来说角色权限就角色表和权限表,然后就是用户、角色、权限的关系维护!其实也可以不用他自带的方法!

基本表的关系都是多对多可以使用attach和detch、sync来维护他们之间的关系!

如果自己玩得够熟悉了,也不需要他的关系表,完全可以自己写好来实现这一成的关系!

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

129

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

77

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

81

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

60

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

444

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

15

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

12

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

5

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号