lbausch / laravel-fortress
Laravel 授权的角色的权限
Requires
- laravel/framework: 5.4.*|5.5.*
Requires (Dev)
- phpunit/phpunit: 5.*
README
Laravel 授权的角色的权限
Laravel 5.1.11 已经内置了一个出色的 授权系统。Fortress 旨在以易于使用、非侵入性的方式添加角色和权限的功能。
3步轻松安装
使用 composer 安装包:
composer require lbausch/laravel-fortress
在 config/app.php 中添加服务提供者:
Bausch\LaravelFortress\ServiceProvider::class,
发布数据库迁移和配置文件:
php artisan vendor:publish --provider="Bausch\LaravelFortress\ServiceProvider"
运行 php artisan migrate 完成安装(自动添加 Facade Fortress)。
使用 Laravel Fortress
保护您的模型
每个需要由 Fortress 保护的数据模型(如 User、Group 等)都需要实现 Contract FortressGuardContract,并且可以使用 Trait FortressGuardTrait(除了 AuthorizableContract 和 Authorizable)。
... use Bausch\LaravelFortress\Contracts\FortressGuardContract; use Bausch\LaravelFortress\Traits\FortressGuardTrait as FortressGuard; class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract, FortressGuardContract { use Authenticatable, Authorizable, CanResetPassword, FortressGuard; ...
之后,模型上可以访问以下方法
assignRole($role_name, $resource = null):将角色(对于资源)分配给模型revokeRole($role_name, $resource = null):从模型中撤销角色(对于资源)hasRole($role_name, $resource = null):检查角色(对于资源)hasPermission($permission_name, $resource = null):检查权限(对于资源)destroyRoles():销毁模型拥有的所有角色
您还可以在模型上定义一个名为 fortress_relations() 的方法,并返回一个应该检查的额外模型(例如 Group)的 \Illuminate\Support\Collection
... /** * Fortress Relations. * * @return \Illuminate\Support\Collection */ public function fortress_relations() { return $this->groups; } /** * Groups. * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ public function groups() { return $this->belongsToMany(Group::class, 'group_members'); } ...
全局角色
如您所注意到的,$resource 参数是可选的。您可以分配仅适用于特定资源的角色,或者如果省略了 $resource 参数,则分配所谓的“全局角色”。全局角色不适用于特定资源(例如文章、博客等),并在配置文件 config/laravel-fortress.php 中定义。
<?php /* * Define Roles here which do not apply to a specific Resource. * * role_name => [permissions] */ return [ 'admin' => [ 'broadcast', 'manageUsers', ], ];
全局角色可以像普通角色一样验证 - 简单地使用 can() 方法:$user->can('broadcast');。当然,$user->hasRole($global_role_name) 和 $user->hasPermission($global_permission_name) 也可以。
策略
要为资源分配角色,您需要有一个针对资源的策略。您需要做的就是实现 FortressPolicy 所需的 fortress_roles() 方法。在 fortress_roles() 方法内部,您可以指定仅适用于策略所属资源的角色和权限。确保按照您为策略方法命名权限(例如,不要使用空格)。
... use Bausch\LaravelFortress\Contracts\FortressPolicy; class BlogPolicy implements FortressPolicy { /** * Fortress Roles. * * @return array */ public function fortress_roles() { return [ 'owner' => [ 'edit', 'destroy', ], ]; } ...
中间件
要使用提供的中间件,您需要将其添加到您的 Kernel(app/Http/Kernel.php)
... /** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ ... 'role' => \Bausch\LaravelFortress\Http\Middleware\VerifyGlobalRole::class, 'permission' => \Bausch\LaravelFortress\Http\Middleware\VerifyGlobalPermission::class, ... ]; ...
以下示例(app/Http/routes.php)说明了如何使用中间件
Route::group(['middleware' => 'role:admin'], function () { }); Route::group(['middleware' => 'permission:broadcast'], function () { });
注意,中间件目前只能验证全局角色和权限。
检索所有允许的资源
您通常会想检索您的用户/组具有特定权限的所有资源。Fortress 可以满足您的需求
$readable_blogs = $user->myAllowedResources('read', Blog::class);
此方法将返回用户具有“读取”权限的所有博客。
重要:当涉及解析请求的资源时,myAllowedResources 方法相当有限,因为它会生成大量的查询(每个找到的资源都会生成一个)。幸运的是,你可以传递一个闭包作为第三个参数,并自己提供解析逻辑(例如,也检索某些关系)。
$readable_blogs = $user->myAllowedResources('read', Blog::class, function($resources) { // $resources contains a Collection of all found Resources return Blogs::whereIn('id', $resources->pluck('resource_id')); });
检索具有特定权限的所有模型
如果你想找到给定资源上具有特定权限的所有模型,只需在 Fortress 门面上调用电 allowedModels() 方法。
$users_who_can_read_this_blog = \Fortress::allowedModels('read', $blog_instance');
当然,allowedModels() 也接受一个闭包作为第三个参数,允许你使用自己的解析逻辑。
如果你想使用依赖注入,请使用 \Bausch\LaravelFortress\Contracts\Fortress::class。
关于删除模型的说明
Fortress 会拦截模型的删除过程。这意味着如果你从数据库中删除使用 FortressGuardTrait 的模型,所有分配的角色都会从数据库中删除。如果你的模型使用软删除功能,所有分配的角色都会保留,直到你的模型被永久删除。