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 响应:

posted @ 2019-05-22 21:43  小呆1107  阅读(197)  评论(0编辑  收藏  举报