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
  • 相关阅读:
    窗内的星星
    亚特兰蒂斯
    你能回答这些问题吗
    区间最大公约数
    集训队8月14日(树状数组)
    一个简单的整数问题2
    谜一样的牛
    楼兰图腾
    Eternal Victory
    集训队8月12日(并查集)
  • 原文地址:https://www.cnblogs.com/agang-php/p/13771951.html
Copyright © 2011-2022 走看看