Bouncer 是一种优雅的、与框架无关的方法,用于使用 Eloquent 模型管理任何应用程序的角色和能力。
bouncer:cleanBouncer 是一种优雅的、与框架无关的方法,用于使用 Eloquent 模型管理任何应用程序的角色和能力。它具有富有表现力和流畅的语法,尽可能地不妨碍您:需要时使用它,不需要时忽略它。
有关 Bouncer 功能的快速、一目了然的列表,请查看备忘单。
Bouncer 与您在自己的应用程序中硬编码的其他功能配合得很好。您的代码始终优先:如果您的代码允许执行某个操作,Bouncer 不会干扰。
安装后,您只需告诉保镖您希望在门口允许什么:
// Give a user the ability to create posts
Bouncer:: allow ( $ user )-> to ( ' create ' , Post::class);
// Alternatively, do it through a role
Bouncer:: allow ( ' admin ' )-> to ( ' create ' , Post::class);
Bouncer:: assign ( ' admin ' )-> to ( $ user );
// You can also grant an ability only to a specific model
Bouncer:: allow ( $ user )-> to ( ' edit ' , $ post );当你在 Laravel 的门口检查能力时,会自动咨询 Bouncer。如果 Bouncer 看到已授予当前用户的能力(无论是直接授予还是通过角色授予),它将授权检查。
注意:Bouncer v1.0.2 需要 PHP 8.2+ 和 Laravel/Eloquent 11+。
如果您使用的是 Laravel v6-v10,请使用 Bouncer v1.0.1。如果您使用的是 Laravel v5.5-v5.8,请使用 Bouncer RC6。
使用 Composer 安装 Bouncer:
composer require silber/bouncer
将 Bouncer 的特征添加到您的用户模型中:
use Silber Bouncer Database HasRolesAndAbilities ;
class User extends Model
{
use HasRolesAndAbilities;
}现在,运行 Bouncer 的迁移。首先通过运行以下命令将迁移发布到应用程序的migrations目录中:
php artisan vendor:publish --tag="bouncer.migrations"
最后,运行迁移:
php artisan migrate
每当您在代码中使用Bouncer外观时,请记住将此行添加到文件顶部的命名空间导入中:
use Bouncer ;有关 Laravel Facade 的更多信息,请参阅 Laravel 文档。
使用 Composer 安装 Bouncer:
composer require silber/bouncer
使用 Eloquent Capsule 组件设置数据库:
use Illuminate Database Capsule Manager as Capsule ;
$ capsule = new Capsule ;
$ capsule -> addConnection ([ /* connection config */ ]);
$ capsule -> setAsGlobal ();有关更多详细信息,请参阅 Eloquent Capsule 文档。
通过以下任一方法运行迁移:
使用 vagabond 等工具在 Laravel 应用程序之外运行 Laravel 迁移。您将在迁移存根文件中找到必要的迁移。
或者,您可以直接在数据库中运行原始 SQL。
将 Bouncer 的特征添加到您的用户模型中:
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database HasRolesAndAbilities ;
class User extends Model
{
use HasRolesAndAbilities;
}创建 Bouncer 的实例:
use Silber Bouncer Bouncer ;
$ bouncer = Bouncer:: create ();
// If you are in a request with a current user
// that you'd wish to check permissions for,
// pass that user to the "create" method:
$ bouncer = Bouncer:: create ( $ user );如果您在应用程序中使用依赖注入,则可以将Bouncer实例注册为容器中的单例:
use Silber Bouncer Bouncer ;
use Illuminate Container Container ;
Container:: getInstance ()-> singleton (Bouncer::class, function () {
return Bouncer:: create ();
});您现在可以将Bouncer注入任何需要它的类中。
create方法创建一个具有合理默认值的Bouncer实例。要完全自定义它,请使用make方法获取工厂实例。在工厂上调用create()来创建Bouncer实例:
use Silber Bouncer Bouncer ;
$ bouncer = Bouncer:: make ()
-> withCache ( $ customCacheInstance )
-> create ();查看Factory类以查看所有可用的自定义。
设置在整个应用程序中使用哪个模型作为用户模型:
$ bouncer -> useUserModel (User::class);有关其他配置,请查看下面的配置部分。
默认情况下,Bouncer 的查询会针对当前请求进行缓存。为了获得更好的性能,您可能需要启用交叉请求缓存。
为用户添加角色和能力变得非常容易。您不必提前创建角色或能力。只需传递角色/能力的名称,如果不存在,Bouncer 就会创建它。
注意:下面的示例都使用
Bouncer外观。如果您不使用外观,则可以将SilberBouncerBouncer的实例注入到您的类中。
让我们创建一个名为admin角色,并赋予它ban-users访问我们网站的能力:
Bouncer:: allow ( ' admin ' )-> to ( ' ban-users ' );就是这样。在幕后,Bouncer 将为您创建Role模型和Ability模型。
如果您想向角色/能力添加其他属性,例如人类可读的标题,您可以使用Bouncer类上的role和ability方法手动创建它们:
$ admin = Bouncer:: role ()-> firstOrCreate ([
' name ' => ' admin ' ,
' title ' => ' Administrator ' ,
]);
$ ban = Bouncer:: ability ()-> firstOrCreate ([
' name ' => ' ban-users ' ,
' title ' => ' Ban users ' ,
]);
Bouncer:: allow ( $ admin )-> to ( $ ban );现在要将admin角色授予用户,只需告诉保镖应该为给定用户分配管理员角色:
Bouncer:: assign ( ' admin ' )-> to ( $ user );或者,您可以直接对用户assign方法:
$ user -> assign ( ' admin ' );有时您可能想直接赋予用户某种能力,而不使用角色:
Bouncer:: allow ( $ user )-> to ( ' ban-users ' );在这里,您也可以直接从用户那里完成相同的操作:
$ user -> allow ( ' ban-users ' );有时您可能希望将功能限制为特定模型类型。只需将模型名称作为第二个参数传递即可:
Bouncer:: allow ( $ user )-> to ( ' edit ' , Post::class);如果您想限制特定模型实例的能力,请传入实际模型:
Bouncer:: allow ( $ user )-> to ( ' edit ' , $ post );使用toOwn方法允许用户管理自己的模型:
Bouncer:: allow ( $ user )-> toOwn (Post::class);现在,当在入口处检查用户是否可以对给定帖子执行操作时,帖子的user_id将与登录用户的id进行比较(这可以自定义)。如果它们匹配,则门将允许该操作。
上述内容将授予用户“拥有”模型的所有能力。您可以通过调用to方法来限制能力:
Bouncer:: allow ( $ user )-> toOwn (Post::class)-> to ( ' view ' );
// Or pass it an array of abilities:
Bouncer:: allow ( $ user )-> toOwn (Post::class)-> to ([ ' view ' , ' update ' ]);您还可以允许用户拥有应用程序中的所有类型的模型:
Bouncer:: allow ( $ user )-> toOwnEverything ();
// And to restrict ownership to a given ability
Bouncer:: allow ( $ user )-> toOwnEverything ()-> to ( ' view ' );保镖还可以收回用户之前分配的角色:
Bouncer:: retract ( ' admin ' )-> from ( $ user );或者直接在用户上执行:
$ user -> retract ( ' admin ' );保镖还可以删除先前授予用户的能力:
Bouncer:: disallow ( $ user )-> to ( ' ban-users ' );或者直接针对用户:
$ user -> disallow ( ' ban-users ' );注意:如果用户具有允许他们
ban-users角色,他们仍然具有该能力。要禁止它,请从角色中删除该能力或从用户中撤回该角色。
如果该能力是通过角色授予的,请告诉保镖从该角色中删除该能力:
Bouncer:: disallow ( ' admin ' )-> to ( ' ban-users ' );要删除特定模型类型的功能,请将其名称作为第二个参数传递:
Bouncer:: disallow ( $ user )-> to ( ' delete ' , Post::class);警告:如果用户有能力
delete特定的$post实例,上面的代码不会删除该能力。您必须单独删除该功能 - 通过传入实际的$post作为第二个参数 - 如下所示。
要删除特定模型实例的功能,请传入实际模型:
Bouncer:: disallow ( $ user )-> to ( ' delete ' , $ post );注意:
disallow方法仅删除先前授予此用户/角色的能力。如果您想禁止更通用的能力所允许的子集,请使用forbid方法。
Bouncer 还允许您forbid给定的能力,以进行更细粒度的控制。有时,您可能希望授予用户/角色涵盖广泛操作的能力,但随后限制这些操作的一小部分。
以下是一些示例:
您可能允许用户一般查看所有文档,但不允许他们查看特定的高度机密文档:
Bouncer:: allow ( $ user )-> to ( ' view ' , Document::class);
Bouncer:: forbid ( $ user )-> to ( ' view ' , $ classifiedDocument );您可能希望允许superadmin在您的应用程序中执行所有操作,包括添加/删除用户。那么您可能拥有一个admin角色,除了管理用户之外,它还可以执行所有操作:
Bouncer:: allow ( ' superadmin ' )-> everything ();
Bouncer:: allow ( ' admin ' )-> everything ();
Bouncer:: forbid ( ' admin ' )-> toManage (User::class);您可能希望偶尔禁止用户,取消他们对所有能力的许可。然而,实际上删除他们所有的角色和能力意味着当禁令被取消时我们必须弄清楚他们原来的角色和能力是什么。
使用禁止能力意味着他们可以保留所有现有的角色和能力,但仍然不被授权做任何事情。我们可以通过创建一个特殊的banned角色来实现这一点,我们将禁止该角色的所有内容:
Bouncer:: forbid ( ' banned ' )-> everything ();然后,每当我们想要禁止用户时,我们都会为他们分配banned角色:
Bouncer:: assign ( ' banned ' )-> to ( $ user );要删除禁令,我们只需撤回用户的角色即可:
Bouncer:: retract ( ' banned ' )-> from ( $ user );如您所见,Bouncer 的禁止功能使您可以对应用程序中的权限进行大量精细控制。
要删除禁止的能力,请使用unforbid方法:
Bouncer:: unforbid ( $ user )-> to ( ' view ' , $ classifiedDocument );注意:这将删除任何以前禁止的能力。如果授予该用户/角色的其他常规能力尚未允许该能力,则它不会自动允许该能力。
注意:一般来说,您不需要直接检查角色。最好允许角色具有某些能力,然后检查这些能力。如果你需要的东西很笼统,你就能创造出很广泛的能力。例如,
access-dashboard功能始终比直接检查admin或editor角色更好。在极少数情况下,您确实想要检查角色,可以在此处使用该功能。
保镖可以检查用户是否具有特定角色:
Bouncer:: is ( $ user )-> a ( ' moderator ' );如果您要检查的角色以元音开头,您可能需要使用an方法:
Bouncer:: is ( $ user )-> an ( ' admin ' );相反,您还可以检查用户是否没有特定角色:
Bouncer:: is ( $ user )-> notA ( ' moderator ' );
Bouncer:: is ( $ user )-> notAn ( ' admin ' );您可以检查用户是否具有多种角色之一:
Bouncer:: is ( $ user )-> a ( ' moderator ' , ' editor ' );您还可以检查用户是否具有所有给定的角色:
Bouncer:: is ( $ user )-> all ( ' editor ' , ' moderator ' );您还可以检查用户是否没有给定的角色:
Bouncer:: is ( $ user )-> notAn ( ' editor ' , ' moderator ' );这些检查也可以直接对用户进行:
$ user -> isAn ( ' admin ' );
$ user -> isA ( ' subscriber ' );
$ user -> isNotAn ( ' admin ' );
$ user -> isNotA ( ' subscriber ' );
$ user -> isAll ( ' editor ' , ' moderator ' );您可以通过用户是否具有给定角色来查询他们:
$ users = User:: whereIs ( ' admin ' )-> get ();您还可以传递多个角色来查询具有任何给定角色的用户:
$ users = User:: whereIs ( ' superadmin ' , ' admin ' )-> get ();要查询具有所有给定角色的用户,请使用whereIsAll方法:
$ users = User:: whereIsAll ( ' sales ' , ' marketing ' )-> get ();您可以直接从用户模型获取用户的所有角色:
$ roles = $ user -> getRoles ();您可以直接从用户模型获取用户的所有能力:
$ abilities = $ user -> getAbilities ();这将返回用户允许的能力的集合,包括通过用户的角色授予用户的任何能力。
您还可以获得已明确禁止的能力列表:
$ forbiddenAbilities = $ user -> getForbiddenAbilities ();授权用户直接在 Laravel 的Gate或用户模型上处理( $user->can($ability) )。
为了方便起见, Bouncer类提供了以下直通方法:
Bouncer:: can ( $ ability );
Bouncer:: can ( $ ability , $ model );
Bouncer:: canAny ( $ abilities );
Bouncer:: canAny ( $ abilities , $ model );
Bouncer:: cannot ( $ ability );
Bouncer:: cannot ( $ ability , $ model );
Bouncer:: authorize ( $ ability );
Bouncer:: authorize ( $ ability , $ model );它们直接调用Gate类上的等效方法。
Bouncer 不添加自己的刀片指令。由于 Bouncer 直接与 Laravel 的门配合使用,因此只需使用其@can指令来检查当前用户的能力:
@can ('update', $post)
< a href =" {{ route('post.update', $post) }} " > Edit Post </ a >
@endcan由于通常不建议直接检查角色,因此 Bouncer 没有为此提供单独的指令。如果您仍然坚持检查角色,可以使用通用@if指令来执行此操作:
@ if ( $ user -> isAn ( ' admin ' ))
//
@endifBouncer 执行的所有查询都会针对当前请求进行缓存。如果启用跨请求缓存,缓存将在不同请求之间持续存在。
无论何时您需要,您都可以完全刷新保镖的缓存:
Bouncer:: refresh ();注意:为所有用户完全刷新缓存会使用缓存标记(如果可用)。并非所有缓存驱动程序都支持此功能。请参阅 Laravel 的文档以查看您的驱动程序是否支持缓存标签。如果您的驱动程序不支持缓存标记,则调用
refresh可能会有点慢,具体取决于系统中的用户数量。
或者,您可以仅为特定用户刷新缓存:
Bouncer:: refreshFor ( $ user );注意:使用多租户范围时,这只会刷新当前范围上下文中用户的缓存。要清除不同范围上下文中同一用户的缓存数据,必须从该范围内调用它。
Bouncer 完全支持多租户应用程序,允许您在同一应用程序中无缝集成所有租户的 Bouncer 角色和能力。
首先,首先将范围中间件发布到您的应用程序中:
php artisan vendor:publish --tag="bouncer.middleware"
中间件现在将发布到app/Http/Middleware/ScopeBouncer.php 。您可以在该中间件中告诉 Bouncer 对于当前请求使用哪个租户。例如,假设您的用户都有account_id属性,那么您的中间件将如下所示:
public function handle ( $ request , Closure $ next )
{
$ tenantId = $ request -> user ()-> account_id ;
Bouncer:: scope ()-> to ( $ tenantId );
return $ next ( $ request );
}当然,您可以自由修改此中间件以满足您应用程序的需求,例如从子域等中提取租户信息。
现在中间件已经就位,请务必将其注册到您的 HTTP 内核中:
protected $ middlewareGroups = [
' web ' => [
// Keep the existing middleware here, and add this:
App Http Middleware ScopeBouncer::class,
]
];Bouncer 的所有查询现在都将限定于给定租户。
根据应用程序的设置,您实际上可能并不希望所有查询的范围都限于当前租户。例如,您可能拥有一组对所有租户都相同的固定角色/能力,并且仅允许您的用户控制为哪些用户分配哪些角色以及哪些角色具有哪些能力。为了实现这一点,您可以告诉 Bouncer 的作用域仅作用于 Bouncer 模型之间的关系,而不是模型本身:
Bouncer:: scope ()-> to ( $ tenantId )-> onlyRelations ();此外,您的应用程序甚至可能不允许用户控制给定角色拥有哪些能力。在这种情况下,请告诉 Bouncer 的范围从范围中排除角色能力,以便这些关系在所有租户中保持全局:
Bouncer:: scope ()-> to ( $ tenantId )-> onlyRelations ()-> dontScopeRoleAbilities ();如果您的需求比上面概述的更加专业,您可以使用您需要的任何自定义逻辑创建自己的Scope :
use Silber Bouncer Contracts Scope ;
class MyScope implements Scope
{
// Whatever custom logic your app needs
}然后,在服务提供商中注册您的自定义范围:
Bouncer:: scope ( new MyScope ); Bouncer 将在其执行过程中的各个点调用Scope接口上的方法。您可以根据您的具体需求自由处理它们。
Bouncer 附带了合理的默认值,因此大多数时候不需要任何配置。为了进行更细粒度的控制,可以通过调用Bouncer类上的各种配置方法来自定义 Bouncer。
如果您只使用这些配置选项中的一两个,则可以将它们粘贴到主AppServiceProvider的boot方法中。如果它们开始增长,您可以在app/Providers目录中创建一个单独的BouncerServiceProvider类(请记住将其注册到providers配置数组中)。
默认情况下,Bouncer 执行的所有查询都会针对当前请求进行缓存。为了获得更好的性能,您可能需要使用跨请求缓存:
Bouncer:: cache ();警告:如果您启用交叉请求缓存,则每当您更改用户的角色/能力时,您都有责任刷新缓存。有关如何刷新缓存,请参阅刷新缓存。
相反,您有时可能希望完全禁用缓存,即使在同一个请求中:
Bouncer:: dontCache ();当您想要针对刚刚授予的角色/能力运行断言时,这在单元测试中特别有用。
要更改 Bouncer 使用的数据库表名称,请将关联数组传递给tables方法。键应该是 Bouncer 的默认表名称,值应该是您希望使用的表名称。您不必传入所有表名称;只更改您想要更改的内容。
Bouncer:: tables ([
' abilities ' => ' my_abilities ' ,
' permissions ' => ' granted_abilities ' ,
]);Bouncer 的已发布迁移使用此配置中的表名称,因此请确保在实际运行迁移之前将这些名称准备就绪。
您可以轻松扩展 Bouncer 的内置Role和Ability模型:
namespace App Models ;
use Silber Bouncer Database Ability as BouncerAbility ;
class Ability extends BouncerAbility
{
// custom code
} namespace App Models ;
use Silber Bouncer Database Role as BouncerRole ;
class Role extends BouncerRole
{
// custom code
}或者,您可以使用 Bouncer 的IsAbility和IsRole特征,而无需实际扩展任何 Bouncer 模型:
namespace App Models ;
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database Concerns IsAbility ;
class Ability extends Model
{
use IsAbility;
// custom code
} namespace App Models ;
use Illuminate Database Eloquent Model ;
use Silber Bouncer Database Concerns IsRole ;
class Role extends Model
{
use IsRole;
// custom code
}如果您使用特征而不是扩展 Bouncer 的模型,请务必自行设置正确的$table名称和$fillable字段。
无论您使用哪种方法,下一步都是实际告诉 Bouncer 使用您的自定义模型:
Bouncer:: useAbilityModel ( App Models Ability::class);
Bouncer:: useRoleModel ( App Models Role::class);注意:Eloquent 根据父模型名称确定关系的外键(请参阅 Eloquent 文档)。为了简单起见,将您的自定义类命名为与 Bouncer 相同的名称:分别为
Ability和Role。如果您需要使用不同的名称,请务必更新迁移文件或覆盖关系方法以显式设置其外键。
默认情况下,Bouncer 自动使用默认身份验证防护的用户模型。
如果您将 Bouncer 与非默认防护一起使用,并且它使用不同的用户模型,您应该让 Bouncer 了解您想要使用的用户模型:
Bouncer:: useUserModel ( App Admin::class);在 Bouncer 中,所有权的概念用于允许用户对他们“拥有”的模型执行操作。
默认情况下,Bouncer 将根据当前用户的主键检查模型的user_id 。如果需要,可以将其设置为不同的属性:
Bouncer:: ownedVia ( ' userId ' );如果不同的模型使用不同的所有权列,您可以分别注册它们:
Bouncer:: ownedVia (Post::class, ' created_by ' );
Bouncer:: ownedVia (Order::class, ' entered_by ' );为了更好地控制,您可以使用自定义逻辑传递闭包:
Bouncer:: ownedVia (Game::class, function ( $ game , $ user ) {
return $ game -> team_id == $ user -> team_id ;
});人们不断询问 Bouncer 中的一些概念,因此以下是其中一些主题的简短列表:
播种初始角色和能力可以在常规 Laravel 播种者课程中完成。首先为 Bouncer 创建一个特定的种子文件:
php artisan make:seeder BouncerSeeder
将所有播种角色和能力代码放入播种者的run方法中。下面是一个示例:
use Bouncer ;
use Illuminate Database Seeder ;
class BouncerSeeder extends Seeder
{
public function run ()
{
Bouncer:: allow ( ' superadmin ' )-> everything ();
Bouncer:: allow ( ' admin ' )-> everything ();
Bouncer:: forbid ( ' admin ' )-> toManage (User::class);
Bouncer:: allow ( ' editor ' )-> to ( ' create ' , Post::class);
Bouncer:: allow ( ' editor ' )-> toOwn (Post::class);
// etc.
}
}要实际运行它,请将播种器的类名传递给db:seed命令的class选项:
php artisan db:seed --class=BouncerSeeder
Bouncer 的scope可用于划分网站的不同部分,为每个部分创建一个具有自己的一组角色和能力的孤岛:
创建一个ScopeBouncer中间件,它接受$identifier并将其设置为当前作用域:
use Bouncer , Closure ;
class ScopeBouncer
{
public function handle ( $ request , Closure $ next , $ identifier )
{
Bouncer:: scope ()-> to ( $ identifier );
return $ next ( $ request );
}
}在您的 HTTP 内核类中注册这个新的中间件作为路由中间件:
protected $ routeMiddleware = [
// Keep the other route middleware, and add this:
' scope-bouncer ' => App Http Middleware ScopeBouncer::class,
];在您的路线服务提供商中,分别为公共路线和仪表板路线应用具有不同标识符的中间件:
Route:: middleware ([ ' web ' , ' scope-bouncer:1 ' ])
-> namespace ( $ this -> namespace )
-> group ( base_path ( ' routes/public.php ' ));
Route:: middleware ([ ' web ' , ' scope-bouncer:2 ' ])
-> namespace ( $ this -> namespace )
-> group ( base_path ( ' routes/dashboard.php ' ));就是这样。现在,所有角色和能力将分别针对站点的每个部分进行划分。要微调范围的范围,请参阅自定义 Bouncer 的范围。
从 Laravel 5.4 开始,默认数据库字符集现在是utf8mb4 。如果您在 Laravel 5.4+ 中使用某些数据库的旧版本(MySQL 低于 5.7.7 或 MariaDB 低于 10.2.2),则在尝试在字符串列上创建索引时会收到 SQL 错误。要解决此问题,请更改AppServiceProvider中 Laravel 的默认字符串长度:
use Illuminate Support Facades Schema ;
public function boot ()
{
Schema:: defaultStringLength ( 191 );
}您可以在这篇 Laravel 新闻文章中阅读更多内容。
JSON 列是 MySQL (5.7.8) 和 MariaDB (10.2.7) 的相对较新的补充。如果您使用的是这些数据库的旧版本,则无法使用 JSON 列。
最好的解决方案是升级您的数据库。如果当前无法做到这一点,您可以将已发布的迁移文件更改为使用text列:
- $table->json('options')->nullable();
+ $table->text('options')->nullable(); bouncer:clean bouncer:clean命令删除未使用的能力。运行此命令将删除两种未使用的能力:
未分配的能力- 未分配给任何人的能力。例如:
Bouncer:: allow ( $ user )-> to ( ' view ' , Plan::class);
Bouncer:: disallow ( $ user )-> to ( ' view ' , Plan::class);此时,“查看计划”能力尚未分配给任何人,因此它将被删除。
注意:根据您的应用程序的上下文,您可能不想删除它们。如果您让用户在应用程序的 UI 中管理能力,您可能不想删除未分配的能力。见下文。
孤立能力- 模型已被删除的模型能力:
Bouncer:: allow ( $ user )-> to ( ' delete ' , $ plan );
$ plan -> delete ();由于该计划不再存在,该能力不再有任何用处,因此它将被删除。
如果您只想删除一种未使用的能力,请使用以下标志之一运行它:
php artisan bouncer:clean --unassigned
php artisan bouncer:clean --orphaned
如果您不向其传递任何标志,它将删除两种类型的未使用的能力。
要定期自动运行此命令,请将其添加到控制台内核的计划中:
$ schedule -> command ( ' bouncer:clean ' )-> weekly (); // Adding abilities for users
Bouncer:: allow ( $ user )-> to ( ' ban-users ' );
Bouncer:: allow ( $ user )-> to ( ' edit ' , Post::class);
Bouncer:: allow ( $ user )-> to ( ' delete ' , $ post );
Bouncer:: allow ( $ user )-> everything ();
Bouncer:: allow ( $ user )-> toManage (Post::class);
Bouncer:: allow ( $ user )-> toManage ( $ post );
Bouncer:: allow ( $ user )-> to ( ' view ' )-> everything ();
Bouncer:: allow ( $ user )-> toOwn (Post::class);
Bouncer:: allow ( $ user )-> toOwnEverything ();
// Removing abilities uses the same syntax, e.g.
Bouncer:: disallow ( $ user )-> to ( ' delete ' , $ post );
Bouncer:: disallow ( $ user )-> toManage (Post::class);
Bouncer:: disallow ( $ user )-> toOwn (Post::class);
// Adding & removing abilities for roles
Bouncer:: allow ( ' admin ' )-> to ( ' ban-users ' );
Bouncer:: disallow ( ' admin ' )-> to ( ' ban-users ' );
// You can also forbid specific abilities with the same syntax...
Bouncer:: forbid ( $ user )-> to ( ' delete ' , $ post );
// And also remove a forbidden ability with the same syntax...
Bouncer:: unforbid ( $ user )-> to ( ' delete ' , $ post );
// Re-syncing a user's abilities
Bouncer:: sync ( $ user )-> abilities ( $ abilities );
// Assigning & retracting roles from users
Bouncer:: assign ( ' admin ' )-> to ( $ user );
Bouncer:: retract ( ' admin ' )-> from ( $ user );
// Assigning roles to multiple users by ID
Bouncer:: assign ( ' admin ' )-> to ([ 1 , 2 , 3 ]);
// Re-syncing a user's roles
Bouncer:: sync ( $ user )-> roles ( $ roles );
// Checking the current user's abilities
$ boolean = Bouncer:: can ( ' ban-users ' );
$ boolean = Bouncer:: can ( ' edit ' , Post::class);
$ boolean = Bouncer:: can ( ' delete ' , $ post );
$ boolean = Bouncer:: cannot ( ' ban-users ' );
$ boolean = Bouncer:: cannot ( ' edit ' , Post::class);
$ boolean = Bouncer:: cannot ( ' delete ' , $ post );
// Checking a user's roles
$ boolean = Bouncer:: is ( $ user )-> a ( ' subscriber ' );
$ boolean = Bouncer:: is ( $ user )-> an ( ' admin ' );
$ boolean = Bouncer:: is ( $ user )-> notA ( ' subscriber ' );
$ boolean = Bouncer:: is ( $ user )-> notAn ( ' admin ' );
$ boolean = Bouncer:: is ( $ user )-> a ( ' moderator ' , ' editor ' );
$ boolean = Bouncer:: is ( $ user )-> all ( ' moderator ' , ' editor ' );
Bouncer:: cache ();
Bouncer:: dontCache ();
Bouncer:: refresh ();
Bouncer:: refreshFor ( $ user );其中一些功能也可以直接在用户模型上使用:
$ user -> allow ( ' ban-users ' );
$ user -> allow ( ' edit ' , Post::class);
$ user -> allow ( ' delete ' , $ post );
$ user -> disallow ( ' ban-users ' );
$ user -> disallow ( ' edit ' , Post::class);
$ user -> disallow ( ' delete ' , $ post );
$ user -> assign ( ' admin ' );
$ user -> retract ( ' admin ' );
$ boolean = $ user -> isAn ( ' admin ' );
$ boolean = $ user -> isAn ( ' editor ' , ' moderator ' );
$ boolean = $ user -> isAll ( ' moderator ' , ' editor ' );
$ boolean = $ user -> isNotAn ( ' admin ' , ' moderator ' );
// Querying users by their roles
$ users = User:: whereIs ( ' superadmin ' )-> get ();
$ users = User:: whereIs ( ' superadmin ' , ' admin ' )-> get ();
$ users = User:: whereIsAll ( ' sales ' , ' marketing ' )-> get ();
$ abilities = $ user -> getAbilities ();
$ forbidden = $ user -> getForbiddenAbilities ();在 Spatie 慷慨地赠予社区的无数软件包中,您会发现出色的 laravel-permission 软件包。与 Bouncer 一样,它与 Laravel 的内置门和权限检查很好地集成,但在语法、数据库结构和功能方面有一组不同的设计选择。
Bouncer 是根据 MIT 许可证授权的开源软件