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
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 特等奖学金(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 GPA(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    Java实现 蓝桥杯 算法提高 套正方形(暴力)
    第一届云原生应用大赛火热报名中! helm install “一键安装”应用触手可及!
    云原生时代,2个方案轻松加速百万级镜像
    Knative 基本功能深入剖析:Knative Serving 自动扩缩容 Autoscaler
  • 原文地址:https://www.cnblogs.com/agang-php/p/13771951.html
Copyright © 2011-2022 走看看