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

发布时间 - 2020-06-20 00:00:00    点击率:

下面由laravel教程栏目给大家介绍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,如下面代码

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来维护他们之间的关系!

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


# 您可以  # 都是  # 多个  # 访问权限  # 你也可以  # 在这里  # 说了  # 将是  # 有几个  # 自带 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  网站制作免费,什么网站能看正片电影?  焦点电影公司作品,电影焦点结局是什么?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  使用C语言编写圣诞表白程序  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel如何创建自定义Facades?(详细步骤)  EditPlus中的正则表达式 实战(2)  如何快速搭建虚拟主机网站?新手必看指南  Python文件流缓冲机制_IO性能解析【教程】  如何快速搭建安全的FTP站点?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  做企业网站制作流程,企业网站制作基本流程有哪些?  如何确保FTP站点访问权限与数据传输安全?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  phpredis提高消息队列的实时性方法(推荐)  JavaScript实现Fly Bird小游戏  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  ,网页ppt怎么弄成自己的ppt?  如何基于PHP生成高效IDC网络公司建站源码?  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Bootstrap CSS布局之列表  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  深入理解Android中的xmlns:tools属性  如何在阿里云部署织梦网站?  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel如何实现模型的全局作用域?(Global Scope示例)  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  javascript如何操作浏览器历史记录_怎样实现无刷新导航  太平洋网站制作公司,网络用语太平洋是什么意思?  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  php 三元运算符实例详细介绍  想要更高端的建设网站,这些原则一定要坚持!  Laravel如何使用Eloquent进行子查询  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  如何在IIS中新建站点并配置端口与物理路径?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  制作企业网站建设方案,怎样建设一个公司网站?  Laravel API资源类怎么用_Laravel API Resource数据转换  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何挑选最适合建站的高性能VPS主机?  原生JS获取元素集合的子元素宽度实例