Gate 和 Policy

  • 管理授权逻辑以便控制对资源的访问权限

    • Gate 提供了简单的基于闭包的方式进行授权
    • Policy 和控制器一样,对特定模型或资源上的复杂授权逻辑进行分组
  • Gate 与policy区别
    • Gate 通常用于与模型或资源无关的权限,如访问管理后台
    • Policy 则用于对指定模型或资源的动作进行授权

Gate

  • 编排

    • Gate 总是接收用户实例作为第一个参数,亦可以接收相关的 Eloquent 模型实例作为额外参数
    • Gate 支持Class@method 风格的回调字符串定义,和控制器一样
    • 资源Gate 一次定义多个 Gate 权限,如Gate::resource('posts', 'PostPolicy')
  • 授权动作
    • laravel会自动将用户实例(当前用户)传递到Gate闭包
    • 判断当前用户权限 Gate::allows/denies(methods,$resource)
    • 判断非当前用户是否有权限进行某项操作,forUser方法
      • Gate::forUser($user)->allows('update-post', $post)
  • 拦截Gate检查
    • 需求场景 分配所有权限给指定用户,before方法接受回调

      • Gate::before(function ($user, $ability) {}) 返回非null,则不执行后续检查
    • after 方法定义一个回调在所有授权检查之后执行,但不能在 after 回调中修改授权检查结果

Policy

  • 流程 生成-> 注册 -> 编写

        php artisan make:policy PostPolicyphp artisan make:policy PostPolicy --model=Post//AuthServiceProvider policies 属性来映射 Eloquent 模型及与之对应的 Policy 类
    
Policy方法
  • 不带模型的方法

    • 有些策略方法只接收当前认证的用户,并不接收授权的模型实例作为参数,比如在授权create 动作
  • 访问用户
    • 如果传入的 HTTP 请求由访客用户(未登录)发起,所有 Gate 和 Policy 检查都会返回 false
    • 但可通过声明认证用户参数「可选」或者默认值为 null 来允许访客用户请求通过授权检查
      • public function update(?User $user, Post $post)
  • 策略过滤器before
    • 对特定用户,需要在一个策略方法中对其授权所有权限,比如后台管理员
    • 如果 Policy 类没有包含与待检查权限名称相匹配的授权方法时,该 Policy 类的 before 方法将不会被调用。
Policy授权动作
  • 通过User模型

    • Laravel 自带的 User 模型提供了两个方法用于授权动作:cancant

      • can 方法接收你想要授权的动作和对应的模型作为参数,返回布尔值
      • 如果给定模型没有任何策略被注册,can 方法将会尝试调用与动作名称相匹配的 Gate 闭包
    • 不依赖模型的动作
      • 有些动作比如 create 并不需要依赖给定模型实例,可以传递一个类名到 can 方法,类名会在授权时执行其关联的策略类方法
  • 通过中间件
    • can中间件 Illuminate\Auth\Middleware\Authorize
    • 在路由中使用中间件 Route::put('/post/{post}',func(){...})->middleware('can:update,post');
      • 参数update 要授权的动作名称
      • 参数post传递给策略方法的路由参数,使用了隐式模型绑定
      • 若无用户进行给定动作授权,中间件会产生一个403的http响应
    • 不依赖模型的动作
      • 不需要传入模型实例的动作如 create (本质不用new模型类)
      • Route::post('/post',func(){..})->middleware('can:create,App\Post');
  • 通过控制器辅助函数
    • App\Http\Controllers\Controller 基类的所有控制器提供了 authorize 方法
    • 在控制器内 $this->authorize('create', Post::class),不依赖模型动作
  • 通过Blade模板
    • @can@cant指令
    • 同样支持不依赖模型的动作

laravel小札之Gate与Policy相关推荐

  1. 【转载】古龙·断章·小札[十二]:《多情剑客无情剑》

    古龙·断章·小札[十二]:<多情剑客无情剑> 作者:边城不浪 十年前,朝廷里的风流翰林,兵器谱上排名第三的探花郎黯然出关,展开自我放逐生涯.十年后,流放者归来. <多情剑客无情剑&g ...

  2. laravel小程序微信支付

    php小程序微信支付类 laravel小程序微信支付分享地址http://www.xiaoshu168.com/php/232.html

  3. 文科出身敲出 Instagram,被小札“挤”走,建新冠追踪网站

    作者 | 年素清 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) Instagram以滤镜和图片质量为核心,是全球最火的在线图片及视频分享的社交应用软件之一,而Instagram也 ...

  4. Hibernate使用小札

    前言 Hibernate作为Java中最为流行的O/R映射框架,同时已经完全遵照JPA规范并作为其实现的一个超集,它能够帮助我们快速进行开发,从繁重的持久化层实现中脱离出来.本文将由浅入深为您带来一个 ...

  5. Spring Boot使用方法小札(3):应用启动后做一些事

    有时候我们需要在应用启动或者重启后做一些工作,比如删除一些临时文件或者Redis中的缓存,这在没有使用Spring Boot之前,在Spring框架下是通过ApplicationListener监听器 ...

  6. Deepin文件命令代码小札

    bin 存放二进制可执行文件,常用命令一般都在这里,如上面的ls命令.boot 存放用于系统引导时使用的各种文件.核心映像也经常放在这里,而不是放在根目录中.dev 存放了设备文件,即设备驱动程序,用 ...

  7. Apache 常识小札

    前言 默认首页及网站路径设置 默认首页 默认网站 禁止显示目录 试水设置 淌水篇 额外设置 只允许或者禁止某个域名进行目录访问 禁止某些文件访问 禁止访问某些文件 禁止对常见图片的访问 针对URL相对 ...

  8. Java基础之易错小札

    温故而知新,古人诚不欺我,每一次精进都是一次重新认识. java应用程序 vs 小程序 应用程序是从主线程main() 方法启动 applet小程序嵌在浏览器页面上运行,调用init()线程或者run ...

  9. Vue学习小札——2.6 组件参数校验与非props特性

    <div id="app"><child content="{'a':1}"></child></div>< ...

最新文章

  1. 90 亿美元的“Java 第一版权案”终落幕:谷歌胜,甲骨文败!
  2. 老子不想考试了!英国计算机系学生黑掉校长邮箱:倒闭学校,取消考试
  3. JavaScript类型判断
  4. boost之asio异步io使用实例
  5. 最强的游戏计算机,这可能是市面上体积最小性能最强的游戏主机了
  6. 横流式冷却塔计算风量_10T-1000T冷却塔厂家批发零售
  7. 使用JavaScript将图片保存至本地
  8. arp 原理及查杀方式
  9. ALSA ASOC
  10. PAT (Basic Level) Practice1001 害死人不偿命的(3n+1)猜想
  11. UPS电源扩展功能一UPS干节点通讯接口扩展板,你了解吗?
  12. 第六讲 复数和复指数
  13. 本地搭建wooyun图片无法加载问题解决
  14. 小心肝队-冲刺日志(第五天)
  15. JavaScript小白基础学习教程
  16. 经典算法(2):黄金分割法(Gold)
  17. C++ 操纵算子原理
  18. 形参和实参的定义与区别
  19. [Swift]LeetCode788. 旋转数字 | Rotated Digits
  20. MyBatis手动SQL分页

热门文章

  1. Riemann积分的一点点菜鸡笔记(一)
  2. NFC 音乐墙 (不限手机)[web 接口服务实现-折腾记录]
  3. python数据分析及可视化(十六)金融量化(金融工具、金融分析、Tushare安装使用、双均线分析)
  4. 树莓派 GPIO 控制
  5. MacBook Pro 2018 连接 Wi-Fi 时密码正确却显示密码无效
  6. 打印函数 lodop
  7. 后端开发学习阶段总结
  8. node 获取表单数据 为空_程序员:数据结构和算法,中序线索化二叉树
  9. 60个适用于WordPress的最佳着陆页模板(2020)
  10. python实现罗马数字转换为整数