#### 创建策略
通过命令行创建策略,创建的策略在app/policies文件夹下.
~~~
php artisan make:policy UserPolicy
~~~
我们定义一个方法,用于用户更新时的权限验证.
~~~
public function update(User $currentUser, User $user)
{
return $currentUser->id === $user->id;
}
~~~
update 方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。
使用授权策略需要注意以下两点:
1. 我们并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false.
2. 调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子).
接下来我们还需要在 AuthServiceProvider 类中对授权策略进行设置。AuthServiceProvider 包含了一个 policies 属性,该属性用于将各种模型对应到管理它们的授权策略上。我们需要为用户模型 User 指定授权策略 UserPolicy。
在app/Providers/AuthServiceProvider.php文件中注册策略.
~~~
protected $policies = [
\App\Models\User::class => \App\Policies\UserPolicy::class, //策略所应用的模型
];
~~~
授权策略定义完成之后,我们便可以通过在用户控制器中使用 authorize 方法来验证用户授权策略。默认的 App\Http\Controllers\Controller 类包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授权一个指定的行为,当无权限运行该行为时会抛出 HttpException。authorize 方法接收两个参数,第一个为授权策略的名称,第二个为进行授权验证的数据。
~~~
$this->authorize('update', $user);
~~~
这里 update 是指授权类里的 update 授权方法,$user 对应传参 update 授权方法的第二个参数。正如上面定义 update 授权方法时候提起的,调用时,默认情况下,我们 不需要 传递第一个参数,也就是当前登录用户至该方法内,因为框架会自动加载当前登录用户。
## 再举例一个策略的场景
管理员可以对普通用户进行删除,但是管理员不能删除自己.
~~~
class UserPolicy
{
use HandlesAuthorization;
public function destroy(User $currentUser, User $user)
{
return $currentUser->is_admin && $currentUser->id !== $user->id;
}
}
~~~