Bouncer:一个用于角色和权限授权的 Laravel 包
发布日期:作者: Paul Redmond
Bouncer 是由 Joseph Silber 开发的授权包,它允许在 Laravel 的 授权门 中进行角色和权限检查。该包的描述如下
Bouncer 提供了一种机制来处理 Laravel ACL 中的角色和权限。它具有简洁的语法,尽可能不干预你的代码:在你需要时使用它,不需要时忽略它。
Bouncer 使得使用流畅的 API 快速创建角色和权限变得轻而易举,这些 API 会自动创建它们。
Bouncer::allow('admin')->to('ban-users');
您可以选择在 User
模型中添加 HasRolesAndAbilities
特性。这个特性允许你分配角色和权限,并在模型中进行检查。
use Silber\Bouncer\Database\HasRolesAndAbilities; class User extends Authenticatable{ use Notifiable, HasRolesAndAbilities;}
当你分配一个尚未创建的角色时,Bouncer 会自动创建它。
$user->assign('admin');
作为一个简单的例子,想象一个 数据库种子器,它使用 Bouncer 创建一些角色,并使用 HasRolesAndAbilities
特性将用户分配到一个角色。
public function run(){ \Bouncer::allow('admin')->toManage(Post::class); \Bouncer::allow('editor')->to('update', \App\Post::class); $admin = factory(App\User::class)->create([ 'email' => '[email protected]' ]); $admin->assign('admin'); $editor = factory(App\User::class)->create([ 'email' => '[email protected]' ]); $editor->assign('editor'); factory(App\User::class)->create([ 'email' => '[email protected]' ]);}
这个数据库种子器方便地创建了两个角色:管理员和编辑。管理员将拥有在 App\Post
模型上所有帖子权限。编辑角色只拥有 update
权限。
有了上面的角色、权限和用户,我们可以定义一个路由,并使用 Laravel 的 Authorize
中间件来保护更新 Post
的操作。
Route::get('/posts/{post}', 'PostsController@show') ->name('post.update') ->middleware('can:update,post');
经过身份验证的管理员和编辑都将能够看到帖子,未登录的用户将被重定向到登录页面,而没有 update
权限的已登录用户将收到 403 Forbidden
响应。
在视图中,您可以使用 Laravel 的 @can
指令来检查权限,Bouncer 将拦截检查并授权,如果用户已被授予权限。
@can ('update', $post) <a href="{{ route('post.update', $post) }}">Edit Post</a>@endcan
不仅可以通过角色授予用户权限,还可以直接将权限分配给用户。
$post = \App\Post::first();$normalUser = \App\User::find('email', '[email protected]')->first(); // Only update a specific post, perhaps one this user submitted.$normalUser->allow('update', $post) // Ability to update all posts directly on a user$normalUser->allow('update', \App\Post::class);
Bouncer 提供了用于 检查用户角色 的方法,但 Bouncer 文档警告不要直接检查角色
一般来说,您不应该需要直接检查角色。最好是允许角色拥有某些权限,然后检查这些权限。如果您的需求非常通用,可以创建非常广泛的权限。例如,
access-dashboard
权限总是比直接检查admin
或editor
角色更好。
最后,如果您想获取用户的权限,请调用 $user->getAbilities()
,它将返回一个数据库集合