Laravel笔记-Laravel 5.3中Gate和授权的改进

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


阅读完Laravel中认证的改进后,让我们来看看Laravel5.3中授权的改进吧。

注意:

以下将要说明的几个特点,在5.2的版本中已经被介绍过。但是,这些特点在5.3中被稍稍改进,我们会在这里讨论它们。

Laravel授权入门

如果你已经对Laravel的授权系统很熟悉了,你可以跳过这一节。

Laravel的授权主要围绕2个主要概念来实现:

1.Gates

Gate即决定谁拥有进行什么操作的功能权限(谁可以做什么)。使用Gate去注册用户的操作权限,之后核对Gate此用户是否可以进行给定操作。

2.Policy

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->id === $task->user_id;

    }

}

接下来我们应该向将Policy添加到AuthServiceProvider的Policy以注册到Gate:

protected $policies = [

    \App\Task::class => \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->update(request()->input());

});

我们会检查Gate来看是否允许用户更新给定task。Gate会传递当前认证用户以及给定task到Policy中的update方法(如果用户没有登录,Gate会自动拒绝所有权限询问),如果未授权,我们会以403状态终止。

(另外,难道你没爱上abort_unless这个方法吗?我指的是,看一下它!读起来就好像明白了:“除非Gate允许更新task否则程序将终止”。这就是名副其实最好用的Laravel)

轻松地在控制器中授权请求

Laravel中的控制器使用AuthorizesRequests trait来轻松地为任意请求授权。你可以在控制器里调用授权方法,它将在Gate中核对权限。如果没有权限,请求将会自动以403响应终止。

我们来看一个控制器的案例:

use App\Task;

class TaskController

{

        public function update(Task $task)

        {

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

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

         }

}

和之前一样,Gate将“请教”Policy的update方法并返回它的结果。

(未完待续)

你可能感兴趣的:(Laravel笔记-Laravel 5.3中Gate和授权的改进)