资讯专栏INFORMATION COLUMN

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

xiaoxiaozi / 2131人阅读

摘要:在大多数的开发中,角色和权限的管理都是非常重要的一部分。上关于角色和权限管理的包有很多,今天就为大家介绍几个好用的包。缓存在中,为了提高应用的性能,或自动的存储角色和权限数据。

在大多数的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字段的默认值是AppUser,所以对于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 SpatiePermissionModelsRole;
use SpatiePermissionModelsPermission;

Role::create(["name" => "writer"]);

Permission::create(["name" => "edit articles"]);

Bouncer

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

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

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

use SilberBouncerDatabaseAbility;
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!
@else
    I"m not a writer...
@endrole
@hasanyrole("writer|admin")
    I have one or more of these roles!
@else
    I 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优点:

和Bouncer相比,文档更全一点,Bouncer的README中有些方法并没有说明

数据库结构更加易懂

syncRoles()方法取代了先删除再插入的方式

提供了Blade命令

可以使用多个guards

Bouncer优点:

一行代码就能创建一个角色/行为能力并分配给用户

可以针对单个模型开启或关闭权限

不错的缓存机制

数据库结构设计的非常健壮,添加了一些很有用的字段

✨相关项目的推荐

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

?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-...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25705.html

相关文章

  • 10 个优质的 Laravel 扩展推荐

    摘要:优点使用简单服务自定义数据库查询生成多重定制哪里获取表单构造器说实话,我不喜欢在中混合表单。表单构造器能够让你的表单从视图中分离出去。功能多数据库多域名和子域名自动生成或者配置文件支持队列支持文件分开存储。 showImg(https://segmentfault.com/img/remote/1460000015090896); 这里有 10+ 个用来搭建 Laravel 应用的包 ...

    simon_chen 评论0 收藏0
  • PHP / Laravel API 开发推荐阅读清单

    showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社区优秀文章 Laravel 5.5+passport 放弃 dingo 开发 API 实战,让 API 开发更省心 - 自造车轮。 API 文档神器 Swagger 介绍及在 PHP 项目中使用 - API 文档撰写方案 推荐 Laravel API 项目必须使用的 8 个...

    shmily 评论0 收藏0
  • f-admin——基于Laravel框架开发的基础权限后台系统

    摘要:基础权限后台本项目码云,目前已在公司产品应用,运行在数个客户服务器内。基础权限后台是一套基于框架开发的系统,不需要开发者重复不必要的工作,就可以实现后台功能的快速开发,其主要特点包括集成,安装使用方便。 f-admin基础权限后台 ❤️ 本项目 GitHub / Gitee(码云),目前已在公司产品应用,运行在数个客户服务器内。 f-admin基础权限后台是一套基于Laravel框架开...

    Ali_ 评论0 收藏0
  • Any-基于Laravel5.4新的权限管理后台骨架

    摘要:最简化权限管理系统,基于开发。基于开发,唯一优化的是用权限和路由别名绑定,这样代码写好之后就可以直接使用。如果是超级管理员,即使没有这个权限会自动赋予权限给超级管理员角色。默认管理员账号密码。然后正常执行命令其他命令即可。 Any 最简化权限管理系统,基于 Laravel5.4 开发。由于 Laravel5.5 发布推迟,只好先写个 Laravel5.4版本的,后面再升级上去。演示地址...

    Lavender 评论0 收藏0
  • RBAC-基于角色权限管理

    摘要:基于角色的权限管理权限管理,基于角色的访问控制,就是用户通过角色与权限进行关联。这样,就构造成用户角色权限的授权模型。角色可以理解为一定数量的权限的集合,权限的载体。版主可管理版内的帖子可管理版内的用户等,这些是权限。 RBAC-基于角色的权限管理 RBAC权限管理 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简...

    dingding199389 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<