Laravel筆記-Laravel 5.3中Gate和授權(quán)的改進(jìn)

原文地址: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)吧。

注意:

以下將要說明的幾個(gè)特點(diǎn),在5.2的版本中已經(jīng)被介紹過。但是,這些特點(diǎn)在5.3中被稍稍改進(jìn),我們會(huì)在這里討論它們。

Laravel授權(quán)入門

如果你已經(jīng)對(duì)Laravel的授權(quán)系統(tǒng)很熟悉了,你可以跳過這一節(jié)。

Laravel的授權(quán)主要圍繞2個(gè)主要概念來實(shí)現(xiàn):

1.Gates

Gate即決定誰擁有進(jìn)行什么操作的功能權(quán)限(誰可以做什么)。使用Gate去注冊(cè)用戶的操作權(quán)限,之后核對(duì)Gate此用戶是否可以進(jìn)行給定操作。

2.Policy

Policy負(fù)責(zé)檢查單個(gè)模型的操作權(quán)限。對(duì)于系統(tǒng)中每個(gè)你想要完成授權(quán)的模型,你都需要對(duì)應(yīng)的Policy。

為了弄明白他們是怎么一起起作用的,我們通過命令

php artisan make:policy TaskPolicy

生成一個(gè)假定模型Task。生成后,我們添加一個(gè)檢查用戶是否可以更新給定task的簡(jiǎn)單的更新方法:

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以注冊(cè)到Gate:

protected $policies = [

? ? \App\Task::class => \App\Policies\TaskPolicy::class,

];

AuthServiceProvider會(huì)將Policy注冊(cè)到Gate?,F(xiàn)在開始,所以對(duì)模型Task的授權(quán)檢查都會(huì)指向Task Policy。

為了說明,我們新建一個(gè)更新給定task的簡(jiǎn)單路由:

Route::put('tasks/{task}', function (App\Task $task) {

? ? abort_unless(Gate::allows('update', $task), 403);

? ? $task->update(request()->input());

});

我們會(huì)檢查Gate來看是否允許用戶更新給定task。Gate會(huì)傳遞當(dāng)前認(rèn)證用戶以及給定task到Policy中的update方法(如果用戶沒有登錄,Gate會(huì)自動(dòng)拒絕所有權(quán)限詢問),如果未授權(quán),我們會(huì)以403狀態(tài)終止。

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

輕松地在控制器中授權(quán)請(qǐng)求

Laravel中的控制器使用AuthorizesRequests trait來輕松地為任意請(qǐng)求授權(quán)。你可以在控制器里調(diào)用授權(quán)方法,它將在Gate中核對(duì)權(quán)限。如果沒有權(quán)限,請(qǐng)求將會(huì)自動(dòng)以403響應(yīng)終止。

我們來看一個(gè)控制器的案例:

use App\Task;

class TaskController

{

? ? ? ? public function update(Task $task)

? ? ? ? {

? ? ? ? ? ? ? ?$this->authorize('update', $task);

? ? ? ? ? ? ? ?$task->update(request()->input());

? ? ? ? ?}

}

和之前一樣,Gate將“請(qǐng)教”Policy的update方法并返回它的結(jié)果。

(未完待續(xù))

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、簡(jiǎn)介 除了提供開箱即用的認(rèn)證服務(wù)之外,Laravel 還提供了一個(gè)簡(jiǎn)單的方式來管理授權(quán)邏輯以便控制對(duì)資源的訪問...
    Yaococo88閱讀 2,079評(píng)論 0 0
  • 授權(quán) 簡(jiǎn)介 laravel 除了提供開箱即用的授權(quán)服務(wù),還提供了許多簡(jiǎn)單的方式來管理授權(quán)邏輯和資源的訪問控制。這些...
    Dearmadman閱讀 5,090評(píng)論 0 5
  • 原文鏈接 必備品 文檔:Documentation API:API Reference 視頻:Laracasts ...
    layjoy閱讀 8,712評(píng)論 0 121
  • 必備品文檔:DocumentationAPI: API Reference視頻:Laracasts速查表:Lara...
    ethanzhang閱讀 5,885評(píng)論 0 68
  • 過去做事情急,什么東西拿起來就用,不喜歡進(jìn)行系統(tǒng)性的學(xué)習(xí),造成在使用過程中的錯(cuò)誤和低效,現(xiàn)在感覺自己耐心多了,用之...
    馬文Marvin閱讀 2,079評(píng)論 0 10

友情鏈接更多精彩內(nèi)容