原文地址:https://josephsilber.com/index.php/posts/2016/08/03/authorization-improvements-in-laravel-5-3#table-of-contents
閱讀完Laravel中認(rèn)證的改進(jìn)后控淡,讓我們來看看Laravel5.3中授權(quán)的改進(jìn)吧纺酸。
注意:
以下將要說明的幾個特點抹缕,在5.2的版本中已經(jīng)被介紹過。但是红伦,這些特點在5.3中被稍稍改進(jìn)尊流,我們會在這里討論它們虐杯。
Laravel授權(quán)入門
如果你已經(jīng)對Laravel的授權(quán)系統(tǒng)很熟悉了玛歌,你可以跳過這一節(jié)。
Laravel的授權(quán)主要圍繞2個主要概念來實現(xiàn):
1.Gates
Gate即決定誰擁有進(jìn)行什么操作的功能權(quán)限(誰可以做什么)擎椰。使用Gate去注冊用戶的操作權(quán)限支子,之后核對Gate此用戶是否可以進(jìn)行給定操作。
2.Policy
Policy負(fù)責(zé)檢查單個模型的操作權(quán)限达舒。對于系統(tǒng)中每個你想要完成授權(quán)的模型值朋,你都需要對應(yīng)的Policy。
為了弄明白他們是怎么一起起作用的巩搏,我們通過命令
php artisan make:policy TaskPolicy
生成一個假定模型Task昨登。生成后,我們添加一個檢查用戶是否可以更新給定task的簡單的更新方法:
namespace App\Policies;
use App\Task;
use App\User;
class TaskPolicy{
? ? public function update(User $user, Task $task){
? ? ? ? return $user->id === $task->user_id;
? ? }
}
接下來我們應(yīng)該向?qū)olicy添加到AuthServiceProvider的Policy以注冊到Gate:
protected $policies = [
? ? \App\Task::class => \App\Policies\TaskPolicy::class,
];
AuthServiceProvider會將Policy注冊到Gate」岬祝現(xiàn)在開始丰辣,所以對模型Task的授權(quán)檢查都會指向Task Policy。
為了說明丈甸,我們新建一個更新給定task的簡單路由:
Route::put('tasks/{task}', function (App\Task $task) {
? ? abort_unless(Gate::allows('update', $task), 403);
? ? $task->update(request()->input());
});
我們會檢查Gate來看是否允許用戶更新給定task糯俗。Gate會傳遞當(dāng)前認(rèn)證用戶以及給定task到Policy中的update方法(如果用戶沒有登錄尿褪,Gate會自動拒絕所有權(quán)限詢問)睦擂,如果未授權(quán),我們會以403狀態(tài)終止杖玲。
(另外顿仇,難道你沒愛上abort_unless這個方法嗎?我指的是摆马,看一下它臼闻!讀起來就好像明白了:“除非Gate允許更新task否則程序?qū)⒔K止”。這就是名副其實最好用的Laravel)
輕松地在控制器中授權(quán)請求
Laravel中的控制器使用AuthorizesRequests trait來輕松地為任意請求授權(quán)囤采。你可以在控制器里調(diào)用授權(quán)方法述呐,它將在Gate中核對權(quán)限。如果沒有權(quán)限蕉毯,請求將會自動以403響應(yīng)終止乓搬。
我們來看一個控制器的案例:
use App\Task;
class TaskController
{
? ? ? ? public function update(Task $task)
? ? ? ? {
? ? ? ? ? ? ? ?$this->authorize('update', $task);
? ? ? ? ? ? ? ?$task->update(request()->input());
? ? ? ? ?}
}
和之前一樣,Gate將“請教”Policy的update方法并返回它的結(jié)果代虾。
(未完待續(xù))
进肯。