主要两种方式来实现用户授权:gates
和policy
policy
创建
命令行方式
php artisan make:policy PostPolicy --model=Post
可以通过--model
指定对应的模型
注册
在AuthServiceProvider
的policies
属性中
class AuthServiceProvider extends ServiceProvider
{
.....
/**
* 应用的策略映射。
*
* @var array
*/
protected $policies = [
Post::class => PostPolicy::class,
];
......
}
编写认证方法
在生成的XXXPolicy类中中编写方法,
- 该方法的返回值只能是布尔类型,
- 传入方法的参数中有一个User类型
策略过滤器before
方法
before
方法会在策略中其它所有方法之前执行,这样提供了一种方式来授权动作而不是指定的策略方法来执行判断。这个功能最常见的场景是授权应用的管理员可以访问所有动作:
public function before($user, $ability)
{
if ($user->isSuperAdmin()) {
return true;
}
}
如果你想拒绝用户所有的授权,你应该在 before 方法中返回 false。如果返回的是 null,则通过其它的策略方法来决定授权与否。
使用
1.通过User模型
User模型的实例有两个方法can
,cant
if ($user->can('update', $post)) {
//
}
2.中间件
->middleware('can:update,post');
3.在控制器中
$this->authorize('update', $post);
4.blade中
使用@can
、@cant
指令
@can('update', $post)
<!-- 当前用户可以更新博客 -->
@elsecan('create', $post)
<!-- 当前用户可以新建博客 -->
@endcan
@cannot('update', $post)
<!-- 当前用户不可以更新博客 -->
@elsecannot('create', $post)
<!-- 当前用户不可以新建博客 -->
@endcannot
Gate
待续。。。。
网友评论