资讯专栏INFORMATION COLUMN

Laravel Policy 使用

曹金海 / 1831人阅读

摘要:提供更简单的方式来处理用户授权动作。类似用户认证,有种主要方式来实现用户授权和策略,我这里主要讲解下策略的使用。文档上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。

Laravel 提供更简单的方式来处理用户授权动作。类似用户认证,有 2 种主要方式来实现用户授权:gates 和策略,我这里主要讲解下策略的使用。

文档 上面有详细的说明,我这里只根据自己使用过程做一个简单的笔记。

例子:我这里准备用编辑文章授权来做演示,在这个权限中,只有文章所有者可以编辑,来体验一下 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.5AuthServiceProvider 中包含一个 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 模型中有 cancant 方法来使用策略,如在 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)
  创建
@endcan

@can("update", $post)
  编辑
@endcan

好了,这次就写到这里,希望此篇笔记能帮助到你。

原文地址

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28492.html

相关文章

  • Laravel 5.8 正式发布(文档翻译已启动)

    摘要:现在面向所有人正式发布了。并且有计划将作为可选扩展包发布,你仍然可以在项目中使用它们。是最新的稳定版本,将在年月左右处理收到的错误修复和更新,并在年月左右之前进行安全修复。中文翻译中文翻译已启动,请关注更多翻译文章请见开发者社区 showImg(https://segmentfault.com/img/remote/1460000018318895?w=1680&h=859); Lar...

    hankkin 评论0 收藏0
  • PHP -Casbin: 支持 ACL、RBAC、ABAC 多种模型的 PHP 权限管理框架

    摘要:是一个用语言打造的轻量级开源访问控制框架,目前在开源。采用了元模型的设计思想,支持多种经典的访问控制方案,如基于角色的访问控制基于属性的访问控制等。 showImg(https://segmentfault.com/img/bVbkDJf?w=500&h=220); PHP-Casbin 是一个用 PHP 语言打造的轻量级开源访问控制框架( https://github.com/php...

    rainyang 评论0 收藏0
  • laravel开发扩展记录

    摘要:自动代码扩展开发时遵守的代码风格是项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器。可以利用此扩展来快速构建项目原型。后续还会为大家带来一些最新的技术扩展。 whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置。laravel默认安装。showImg(https://s...

    fancyLuo 评论0 收藏0
  • laravel开发扩展记录

    摘要:自动代码扩展开发时遵守的代码风格是项目开发规范。遵照此规范,在实际操作中,有许多重复,接下来推荐一款专为此规范量身定制的代码生成器。可以利用此扩展来快速构建项目原型。后续还会为大家带来一些最新的技术扩展。 whoops 错误提示扩展 whoops 是一个非常优秀的 PHP Debug 扩展,它能够使你在开发中快速定位出错的位置。laravel默认安装。showImg(https://s...

    魏宪会 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<