原文地址: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方法并返回它的结果。
(未完待续)
。