天天看點

Laravel筆記-Laravel 5.3中Gate和授權的改進

原文位址:https://josephsilber.com/index.php/posts/2016/08/03/authorization-improvements-in-laravel-5-3#table-of-contents

<b>注意:</b> 以下将要說明的幾個特點,在5.2的版本中已經被介紹過。但是,這些特點在5.3中被稍稍改進,我們會在這裡讨論它們。

如果你已經對Laravel的授權系統很熟悉了,你可以跳過這一節。

Laravel的授權主要圍繞2個主要概念來實作:

Gate即決定誰擁有進行什麼操作的功能權限(誰可以做什麼)。使用Gate去注冊使用者的操作權限,之後核對Gate此使用者是否可以進行給定操作。

Policy負責檢查單個模型的操作權限。對于系統中每個你想要完成授權的模型,你都需要對應的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-&gt;id === $task-&gt;user_id;     } }

接下來我們應該向将Policy添加到AuthServiceProvider的Policy以注冊到Gate:

protected $policies = [     \App\Task::class =&gt; \App\Policies\TaskPolicy::class, ];

AuthServiceProvider會将Policy注冊到Gate。現在開始,是以對模型Task的授權檢查都會指向Task Policy。

為了說明,我們建立一個更新給定task的簡單路由:

Route::put('tasks/{task}', function (App\Task $task) {     abort_unless(Gate::allows('update', $task), 403);     $task-&gt;update(request()-&gt;input()); });

我們會檢查Gate來看是否允許使用者更新給定task。Gate會傳遞目前認證使用者以及給定task到Policy中的update方法(如果使用者沒有登入,Gate會自動拒絕所有權限詢問),如果未授權,我們會以403狀态終止。

(另外,難道你沒愛上abort_unless這個方法嗎?我指的是,看一下它!讀起來就好像明白了:“除非Gate允許更新task否則程式将終止”。這就是名副其實最好用的Laravel)

Laravel中的控制器使用AuthorizesRequests trait來輕松地為任意請求授權。你可以在控制器裡調用授權方法,它将在Gate中核對權限。如果沒有權限,請求将會自動以403響應終止。

我們來看一個控制器的案例:

class TaskController {         public function update(Task $task)         {                $this-&gt;authorize('update', $task);                $task-&gt;update(request()-&gt;input());          }

和之前一樣,Gate将“請教”Policy的update方法并傳回它的結果。

(未完待續)