zoukankan      html  css  js  c++  java
  • Laravel Policy 使用

     
     

    准备工作

    安装 laravel

    composer create-project --prefer-dist laravel/laravel laravel-vue "5.5.*"

    建表

    php artisan make:migration posts --create=posts
    
    Schema::create('posts', function (Blueprint $table) {
      $table->increments('id');
      $table->string("title", 200);
      $table->text("content");
      $table->timestamps();
      $table->index('user_id');
    });

    创建 Model

    php artisan make:model PostModel
    
    # app/PostModel.php
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel;
    
    class PostModel extends Model
    {
      protected $table = 'posts';
      protected $fillable = ['title', 'content', 'user_id'];
    }
     

    生成策略

    策略其实就是授权方案所对应的类文件,它在 app/Policies 目录下面,下面我用命令创建一个策略文件。

    php artisan make:policy PostPolicy

    命令执行完毕之后,会生成 app/Policies/PostPolicy.php 文件,下面我们开始编辑它。

    # app/Policies/PostPolicy.php
    namespace AppPolicies;
    
    use AppUser;
    use AppPostModel;
    use IlluminateAuthAccessHandlesAuthorization;
    
    class TopicPolicy
    {
      use HandlesAuthorization;
    
      public function create(User $user)
      {
        // code
      }
    
      public function update(User $user, PostModel $postModel)
      {
        return $user->id  === $postModel->user_id;
      }
    
      public function delete(User $user, PostModel $postModel)
      {
        // code
      }
    }
     

    注册策略

    授权策略需要注册才能使用,在什么地方注册呢?laravel5.5 在 AuthServiceProvider 中包含一个 policies 的属性,这里面注册策略,下面我们看下如何注册。

    # app/Providers/AuthServiceProvider.php
    
    namespace AppProviders;
    
    use IlluminateSupportFacadesGate;
    use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
    
    user AppPostModel;
    use AppPoliciesPostPolicy;
    
    class AuthServiceProvider extends ServiceProvider
    {
      protected $policies = [
        PostModel::class => PostPolicy::class,  // 注意在这里注册 policy
      ];
    
      public function boot()
      {
        $this->registerPolicies();
      }
    }
     

    使用策略

    注册完毕之后,在 User 模型中有 can 和 cant 方法来使用策略,如在 PostController 编辑时使用:

    # app/Http/Controllers/PostController.php
    
    public function create() {
      if (Auth::user()->can('create', PostModel)) { // 注意这里的用法
        // 可以创建
      } else {
        // 无权限
      }
    }
    
    public function update(Request $request) {
      $id = $request->input('id');
      $post = PostModel::findOrFail($id);
      if (Auth::user()->can('update', $post)) {
        // 可以编辑
      } else {
        // 无编辑权限
      }
    }

    如果你想超级管理员也拥有编辑权限的话,可以在定义策略的时候加上策略过滤器,也就是一个 before 方法:

    # app/Policies/PostPolicy.php
    public function before($user, $ability)
    {
      if ($user->isSuperAdmin()) {
        return true;
      }
    }
    
    # app/User.php
    public function isSuperAdmin()
    {
      // 定义ID为1为超级管理员
      if ($this->id == 1) {
        return true;
      }
      return false;
    }

    在 balde 模板中使用 @can 和 @cannot 方法来判断

    @can('create', AppPostModel::class)
      <a href="">创建</a>
    @endcan
    
    @can("update", $post)
      <a href="">编辑</a>
    @endcan
  • 相关阅读:
    黑客网银木马服务器曝光 14家银行网银遭监控 狼人:
    卡巴斯基实验室CE0来华启动卡巴斯基安全中国行 狼人:
    天清汉马UTM获“北京市自主创新产品”称号 狼人:
    IBM称欧亚受Conficker病毒感染最严重 狼人:
    卡巴斯基联手功夫巨星成龙 五月鸟巢开唱 狼人:
    微软4月14日起不再为所有XP用户提供安全补丁 狼人:
    卡巴斯基爱好者见面会 卡巴斯基先生与卡fans亲密互动 狼人:
    愚人节黑客以身试法 人民法院被挂马 狼人:
    微软:97%电子邮件属于垃圾邮件 狼人:
    4月3日 尤金.卡巴斯基在北大精彩演讲 狼人:
  • 原文地址:https://www.cnblogs.com/agang-php/p/13771951.html
Copyright © 2011-2022 走看看