laravel 策略类
Policy(策略)是用于组织基于特定模型或资源的授权逻辑类,例如,如果你开发的是一个博客应用,可以有一个 Post
模型和与之对应的 PostPolicy
来授权用户创建或更新博客的动作。
- 创建一个policy.php文件,比如说要个post模型创建授权逻辑类,php artisan make:policy PostPolicy
- 创建成功之后,会出现在app/policies的文件夹中
- 然后在app/providers/AuthServiceProvider中的数组$policies中添加
//之前会有一个示例,如果没有用的话。可以注释 'App\Post' => 'App\Policies\PostPolicy',
- 添加完成之后,在PostPolicy.php中可以写自己需要设置权限的方法,例如update和delete两个方法
<?php namespace App\Policies; use App\User; use App\Post; use Illuminate\Auth\Access\HandlesAuthorization; class PostPolicy { use HandlesAuthorization; /** * Create a new policy instance. * * @return void */ public function __construct() { // } public function update(User $user, Post $post) { //判断修改改文章的是不是本文作者 return $user->id === $post->user_id; } public function delete(User $user,Post $post) { //判断修改改文章的是不是本文作者 return $user->id===$post->user_id; } }
- 在controller中,需要进行验证的方法中进行判断权限
//只属于本文作者对该文章进行删除操作 public function delete(Post $post) { $this->authorize('delete',$post); $post->delete(); return redirect('article/index'); }
除了提供给
User
模型的辅助函数,Laravel 还为继承自App\Http\Controllers\Controller
基类的所有控制器提供了authorize
方法,和can
方法类似,该方法接收你想要授权的动作名称以及相应模型实例作为参数,如果动作没有被授权,authorize
方法将会抛出Illuminate\Auth\Access\AuthorizationException
,Laravel 默认异常处理器将会将其转化为状态码为403
的 HTTP 响应: