主要兩種方式來(lái)實(shí)現(xiàn)用戶(hù)授權(quán):gates
和policy
policy
創(chuàng)建
命令行方式
php artisan make:policy PostPolicy --model=Post
可以通過(guò)--model
指定對(duì)應(yīng)的模型
注冊(cè)
在AuthServiceProvider
的policies
屬性中
class AuthServiceProvider extends ServiceProvider
{
.....
/**
* 應(yīng)用的策略映射。
*
* @var array
*/
protected $policies = [
Post::class => PostPolicy::class,
];
......
}
編寫(xiě)認(rèn)證方法
在生成的XXXPolicy類(lèi)中中編寫(xiě)方法,
- 該方法的返回值只能是布爾類(lèi)型俯抖,
- 傳入方法的參數(shù)中有一個(gè)User類(lèi)型
策略過(guò)濾器before
方法
before
方法會(huì)在策略中其它所有方法之前執(zhí)行抚官,這樣提供了一種方式來(lái)授權(quán)動(dòng)作而不是指定的策略方法來(lái)執(zhí)行判斷弟蚀。這個(gè)功能最常見(jiàn)的場(chǎng)景是授權(quán)應(yīng)用的管理員可以訪問(wèn)所有動(dòng)作:
public function before($user, $ability)
{
if ($user->isSuperAdmin()) {
return true;
}
}
如果你想拒絕用戶(hù)所有的授權(quán)脚曾,你應(yīng)該在 before 方法中返回 false唐全。如果返回的是 null闽瓢,則通過(guò)其它的策略方法來(lái)決定授權(quán)與否接癌。
使用
1.通過(guò)User模型
User模型的實(shí)例有兩個(gè)方法can
,cant
if ($user->can('update', $post)) {
//
}
2.中間件
->middleware('can:update,post');
3.在控制器中
$this->authorize('update', $post);
4.blade中
使用@can
扣讼、@cant
指令
@can('update', $post)
<!-- 當(dāng)前用戶(hù)可以更新博客 -->
@elsecan('create', $post)
<!-- 當(dāng)前用戶(hù)可以新建博客 -->
@endcan
@cannot('update', $post)
<!-- 當(dāng)前用戶(hù)不可以更新博客 -->
@elsecannot('create', $post)
<!-- 當(dāng)前用戶(hù)不可以新建博客 -->
@endcannot
Gate
待續(xù)缺猛。。椭符。荔燎。