laravel 策略类

Policy(策略)是用于组织基于特定模型或资源的授权逻辑类,例如,如果你开发的是一个博客应用,可以有一个 Post 模型和与之对应的 PostPolicy 来授权用户创建或更新博客的动作。

  • 创建一个policy.php文件,比如说要个post模型创建授权逻辑类,php artisan make:policy PostPolicy
  • 创建成功之后,会出现在app/policies的文件夹中
  • 然后在app/providers/AuthServiceProvider中的数组$policies中添加
    //之前会有一个示例,如果没有用的话。可以注释
    
    'AppPost' => 'AppPoliciesPostPolicy',
  • 添加完成之后,在PostPolicy.php中可以写自己需要设置权限的方法,例如update和delete两个方法
    <?php
    
    namespace AppPolicies;
    
    use AppUser;
    use AppPost;
    use IlluminateAuthAccessHandlesAuthorization;
    
    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 还为继承自 AppHttpControllersController 基类的所有控制器提供了 authorize 方法,和 can 方法类似,该方法接收你想要授权的动作名称以及相应模型实例作为参数,如果动作没有被授权, authorize 方法将会抛出 IlluminateAuthAccessAuthorizationException ,Laravel 默认异常处理器将会将其转化为状态码为 403 的 HTTP 响应:

原文地址:https://www.cnblogs.com/hanmengya/p/10908725.html