在大多数的web开发中,角色和权限的管理都是非常重要的一部分。Laravel上关于角色和权限管理的包有很多,今天就为大家介绍几个好用的包。比如Entrust等,

我们为什么需要第三方包?

首先,Laravel自己本来就已经提供了一些管理权限的基本功能,这些基本的功能在5.1.11版本中就具备了,并且一直保留到现在。常见的方法如下:

  • Gates 和 Policies
  • $this->authorize()方法
  • Blade模版中的@can@cannot命令

也许对于某些人来说,Laravel提供的这些基本的权限管理功能已经足够了。但是,如果你想要更简单更方便的管理权限和角色,那Laravel自带的权限管理功能就不太够用了。下面推荐两款不错的包:

  • Laravel-permission
  • Bouncer

⚠️注意:Github上有这样一个包:santigarcor/laratrust,它其实是Entrust项目中fork出来的一个新的项目(应为Entrust现在已经不再维护了,只支持到Laravel 5),这个用来管理角色和权限也是很不错的。但是,Laratrust中已经把Laravel中的一些默认命令替换掉了,所以在使用的时候不能使用Gates@can语法,取而代之的是$user->can(‘edit-user’)@permission语法,除了这个注意点外,Laratrust是一个很好的项目。此外,值得赞的地方就是Laratrust还具备了适用于团队开发的一些功能,而这个功能在上面两个包中是没有的。

此外,还有一些其他的包,由于项目不太活跃,还有点过时这里不太推荐,但学习一下还是可以的:

  • Romanbican / roles
  • Kodeine / Laravel-acl

详细说一下最上面推荐的两个包

Laravel-permission和Bouncer提供的API让我们在对角色和权限管理时更加简单,而且在调用时代码也很容易理解。在创建规则时,Laravel-permission和Bouncer的方式和Laravel的PoliciesGates有所不同:

$user->givePermissionTo('edit articles'); // Laravel-permission
$user->allow('ban-users'); // Bouncer

上面两个包,除了语法和数据库的结构略有不同外,其他都是差不多的。

具体的安装使用

Laravel-permission和Bouncer的安装方法很相似:

  • composer.json文件添加配置命令并安装
  • config/app.php文件中添加provider 和 facade (Bouncer)
  • 执行Publish和migrations命令
  • 向不同的Model中设置Trait

在做下面的操作前,先要创建一个用户表,并且不要给这个表分配角色和权限,对于新项目来说就是创建一个基础的用户表。接下来,就可以针对这两个包做一些权限控制的操作。

数据表结构

说明:

  • guard_name字段的默认值是web,Laravel-Permission是允许使用不同的guards的。
  • 正如图上看到的,在管理权限方面,Laravel-Permission是使用了两个维度,一个是针对角色,一个是针对用户。
  • model_type字段的默认值是App\User,所以对于user表来说没有直接的外键约束,应为其他表暂时还没有user_id字段。

和Laravel-permission比,是不是明显感觉表之间的关系变简单了?️

说明:

  • 上图中有一个叫abilities的表,这对应于Laravel-permission中的permissions表,然后在Bouncer中,permissions表就关联到abilities中的一系列entity.
  • 在这个包的所有表中,"Entity"就代表了某一个操作的具体对象。它可能代表某一类角色,或是某一特定用户。所以,在上面的表结构中,我们并没有发现与user_idusers属性有直接关系的表,Laravel-permission中也是如此。
  • 在上面的表中,我们还可以看到一些特殊的字段,比如:abilities.titleabilities.only_ownroles.level,这几个字段在以后的使用中会非常有用。
  • 在Bouncer中,并没有具体的guard字段。

从Bouncer的表结构中可以看出,这个设计思路有点特别,虽然就4个表,但是比上面那个要复杂点,对新手来说会难以理解。也正因为它的特别,在使用的时候会很灵活。

可使用的方法函数

两个包在使用上大同小异,来对比下:

创建角色/权限/行为能力
  • Laravel-permission

在Laravel中你可以使用Facades模式:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;Role::create(['name' => 'writer']);Permission::create(['name' => 'edit articles']);
  • Bouncer

可以用一行代码就能创建一个具有某种行为能力的角色:

Bouncer::allow('admin')->to('ban-users');

执行?上面这行,Bouncer就会分别在roles表和abilities表中创建两个记录。如果你习惯于Facades的方式的话,也可以用这样的方法:

use Silber\Bouncer\Database\Ability;
Ability::create(['name' => 'edit articles']);

给用户分配角色
  • Laravel-permission
$user->assignRole('writer');
$user->assignRole(['writer', 'admin']);$user->removeRole('writer');

角色同步:

// 用户所有分配的角色都会被下面的角色数组替换
$user->syncRoles(['writer', 'admin']);
  • Bouncer
$user->assign('admin');
$user->assign(['writer', 'admin']);$user->retract('admin');

可以看到,两个包都支持用一个变量或一个数组来分配角色,但因为Laravel-permission有一个角色同步的功能,所以会跟强大一些,而Bouncer在操作角色同步时会需要一些额外的操作。


给用户分配权限/行为能力
  • Laravel-permission
// 分配
$user->givePermissionTo('edit articles');
$user->givePermissionTo('edit articles', 'delete articles');
// 撤销
$user->revokePermissionTo('edit articles');
  • Bouncer
$user->allow('ban-users');
$user->allow(['ban-users', 'edit-articles']);

在分配权限时,还可以指定模型,只需要把模型的实例对象或类名作为第二个参数:

Bouncer::allow($user)->to('edit', Post::class);
Bouncer::allow($user)->to('edit', $post);$user->disallow('ban-users');
Bouncer::disallow($user)->to('delete', Post::class);

检查用户的权限/角色
  • Laravel-permission

检查角色:

$user->hasRole('writer');
$user->hasAnyRole(Role::all());
$user->hasAllRoles(Role::all());

检查权限:

$user->can('edit articles');
$role->hasPermissionTo('edit articles');
  • Bouncer

检查角色:

$user->isAn('admin');
$user->isA('subscriber', 'editor');
$user->isAll('editor', 'moderator');
$user->isNot('subscriber', 'moderator');

检查权限:

Bouncer::allows('edit articles')

Blade 模版命令
  • Laravel-permission
@role('writer')I'm a writer!
@elseI'm not a writer...
@endrole
@hasanyrole('writer|admin')I have one or more of these roles!
@elseI have none of these roles...
@endhasanyrole
  • Bouncer

Bouncer并没有提供特定的Blade命令。当然,无论是哪个包,都可以在Blade中使用@can@endcan命令。


缓存
  • Laravel-permission

在Laravel-permission中,为了提高应用的性能,或自动的存储角色和权限数据。清除缓存可以使用下面的命令:

php artisan cache:forget spatie.permission.cache
  • Bouncer

Bouncer会缓存当前请求的所有查询数据,如果开启了cross-request缓存,就会跨请求缓存。

刷新缓存:

Bouncer::refresh();

当然也可以只刷新指定用户的缓存:

Bouncer::refreshFor($user);

总结

  • Laravel-permission优点:
  1. 和Bouncer相比,文档更全一点,Bouncer的README中有些方法并没有说明
  2. 数据库结构更加易懂
  3. syncRoles()方法取代了先删除再插入的方式
  4. 提供了Blade命令
  5. 可以使用多个guards
  • Bouncer优点:
  1. 一行代码就能创建一个角色/行为能力并分配给用户
  2. 可以针对单个模型开启或关闭权限
  3. 不错的缓存机制
  4. 数据库结构设计的非常健壮,添加了一些很有用的字段

✨相关项目的推荐

以上两个包只是提供了管理角色和权限的功能,如果有基于这些包的管理模版那该多好呢,下面就介绍两个:

  • ?Laravel 5.4 admin panel based on Spatie Laravel-permission
  • ?Laravel 5.4 admin panel based on Bouncer

关于Laravel上的权限与角色的设置,以后别再说Entrust了,已经过时啦!?️?️?️

原文地址:https://laravel-news.com/two-...

【 Laravel 工具包推荐--角色/权限管理】相关推荐

  1. 使用laravel+Laravel-Roles-Permissions 开发后台权限管理

    使用laravel+Laravel-Roles-Permissions开发后台权限管理 最终效果如下图: 起源 改造过程 一.数据库改造 二.Permission改造 在Models里建了一个叫Per ...

  2. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  3. 后台用户角色权限管理设计

    目录 1.概述 2.设计 2.1 用户管理 2.2 角色管理 2.3 权限管理 2.4 用户.角色.权限的关系 3.总结 1.概述 在设计产品后台系统设置时,可根据不同项目的实际需求来设计后台系统设置 ...

  4. Vue 角色权限管理设计与实现

    目前项目中使用到的角色权限管理共分为三级,分别是页面级.行为级(控件级).接口级,这里记录一下三级权限在 Vue 中的实现. 一.接口设计 用户登录后该用户的角色与权限信息会一同返回给前端,前端将这些 ...

  5. Ant Design Pro v5 获取动态菜单与基于角色权限管理视频教程(33 个视频)

    Ant Design Pro v5 获取动态菜单与基于角色权限管理视频教程(33 个视频) 很多人问如何获取动态菜单的,所以在 antd prov 5 来讲一下角色管理的.从最基础的用户管理,角色管理 ...

  6. springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理

    介绍 本系统为springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理.页面为极简模式,没有任何渲染. 源码:https://gite ...

  7. Jenkins中安装Role-based Authorization Strategy插件来实现用户角色权限管理

    场景 CentOS中Jenkins的下载.安装.配置与启动(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/11649 ...

  8. java用户角色权限管理 只显示姓_扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...

  9. Oracle中用户角色权限管理

    一,Oracle 用户,角色,权限 权限管理是 Oracle 系统的精华,不同用户登录到同一数据库中,可能看到不同数量的表,拥有不同的权限.Oracle 的权限分为系统权限和数据对象权限,共一百多种, ...

  10. Jenkins 用户角色权限管理

    文章目录 背景 安装插件 管理角色 全局角色 项目角色 节点角色 管理用户 分配角色 背景 Jenkins 一般用作团队项目持续集成环境,所以就会设计多用户的情况,我们需要为不同人员设置不同的角色,进 ...

最新文章

  1. QEMU — I/O QoS 的实现方式
  2. python mask 添加logo
  3. java 可视化_可视化Java 9模块关系
  4. 【原创】vegas提示NTDLL.DLL出错的解决办法
  5. Java-java.util.concurrent.LinkedBlockingQueue
  6. B - 小希的迷宫 (并查集判断是否存在环)
  7. 在JAR中打包使用JAR库
  8. IOS中通知中心NSNotificationCenter应用总结
  9. Java学习笔记-全栈-web开发-14-Spring入门AOP编程Spring注解开发Spring事务
  10. 帝国cms模板html文件夹,帝国cms的模板保存在哪里
  11. power apps canvas团队协作开发总结的几种方式
  12. com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
  13. 对《A Fast Parallel Algorithm for Thinning Digital Patterns》一文的理解(上)
  14. Laragon 开机启动自启创建失败
  15. 关于c / c++中power_bound的使用
  16. android 蓝牙连接rtk,基于Android手机的RTK手簿软件设计与实现
  17. WebSocket 结合 Nginx 实现域名及 WSS 协议访问
  18. cassandra 重启失败,nullpoint exception
  19. 自动化测试——QQ邮箱登陆
  20. 马化腾公开信:腾讯将推智慧零售解决方案丨用友前三季度财报营收增长24.4%【软件网每日新闻播报│第10-30期】

热门文章

  1. 2022-2028全球二片罐行业调研及趋势分析报告
  2. hub设备_小米生态链爆品开箱,50W闪充加持,HUB扩展解锁电源新技能
  3. 错误 请再次按下快门释放按钮
  4. ARM9开发板初体验----使用Uboot通过USB下载线烧写bin文件
  5. ceph 运维操作 - POOL
  6. word转换成pdf后图片压缩失真的解决方法
  7. 【Pranet】论文及代码解读(RFB与aggregation部分)——Cavy岚
  8. Linux- 控制 LED 灯设备(LED 子系统)
  9. 居民身份证号码每个数字代表什么
  10. react详细视频 https://www.bilibili.com/video/BV1wy4y1D7JT?p=76