laravel小札之Gate与Policy
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 模型提供了两个方法用于授权动作:
can
和cant
can
方法接收你想要授权的动作和对应的模型作为参数,返回布尔值- 如果给定模型没有任何策略被注册,
can
方法将会尝试调用与动作名称相匹配的Gate
闭包
- 不依赖模型的动作
- 有些动作比如 create 并不需要依赖给定模型实例,可以传递一个类名到 can 方法,类名会在授权时执行其关联的策略类方法
- Laravel 自带的 User 模型提供了两个方法用于授权动作:
- 通过中间件
- 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');
- can中间件
- 通过控制器辅助函数
App\Http\Controllers\Controller
基类的所有控制器提供了authorize
方法- 在控制器内
$this->authorize('create', Post::class)
,不依赖模型动作
- 通过Blade模板
@can
和@cant
指令- 同样支持不依赖模型的动作
laravel小札之Gate与Policy相关推荐
- 【转载】古龙·断章·小札[十二]:《多情剑客无情剑》
古龙·断章·小札[十二]:<多情剑客无情剑> 作者:边城不浪 十年前,朝廷里的风流翰林,兵器谱上排名第三的探花郎黯然出关,展开自我放逐生涯.十年后,流放者归来. <多情剑客无情剑&g ...
- laravel小程序微信支付
php小程序微信支付类 laravel小程序微信支付分享地址http://www.xiaoshu168.com/php/232.html
- 文科出身敲出 Instagram,被小札“挤”走,建新冠追踪网站
作者 | 年素清 责编 | 伍杏玲 出品 | 程序人生(ID:coder_life) Instagram以滤镜和图片质量为核心,是全球最火的在线图片及视频分享的社交应用软件之一,而Instagram也 ...
- Hibernate使用小札
前言 Hibernate作为Java中最为流行的O/R映射框架,同时已经完全遵照JPA规范并作为其实现的一个超集,它能够帮助我们快速进行开发,从繁重的持久化层实现中脱离出来.本文将由浅入深为您带来一个 ...
- Spring Boot使用方法小札(3):应用启动后做一些事
有时候我们需要在应用启动或者重启后做一些工作,比如删除一些临时文件或者Redis中的缓存,这在没有使用Spring Boot之前,在Spring框架下是通过ApplicationListener监听器 ...
- Deepin文件命令代码小札
bin 存放二进制可执行文件,常用命令一般都在这里,如上面的ls命令.boot 存放用于系统引导时使用的各种文件.核心映像也经常放在这里,而不是放在根目录中.dev 存放了设备文件,即设备驱动程序,用 ...
- Apache 常识小札
前言 默认首页及网站路径设置 默认首页 默认网站 禁止显示目录 试水设置 淌水篇 额外设置 只允许或者禁止某个域名进行目录访问 禁止某些文件访问 禁止访问某些文件 禁止对常见图片的访问 针对URL相对 ...
- Java基础之易错小札
温故而知新,古人诚不欺我,每一次精进都是一次重新认识. java应用程序 vs 小程序 应用程序是从主线程main() 方法启动 applet小程序嵌在浏览器页面上运行,调用init()线程或者run ...
- Vue学习小札——2.6 组件参数校验与非props特性
<div id="app"><child content="{'a':1}"></child></div>< ...
最新文章
- 90 亿美元的“Java 第一版权案”终落幕:谷歌胜,甲骨文败!
- 老子不想考试了!英国计算机系学生黑掉校长邮箱:倒闭学校,取消考试
- JavaScript类型判断
- boost之asio异步io使用实例
- 最强的游戏计算机,这可能是市面上体积最小性能最强的游戏主机了
- 横流式冷却塔计算风量_10T-1000T冷却塔厂家批发零售
- 使用JavaScript将图片保存至本地
- arp 原理及查杀方式
- ALSA ASOC
- PAT (Basic Level) Practice1001 害死人不偿命的(3n+1)猜想
- UPS电源扩展功能一UPS干节点通讯接口扩展板,你了解吗?
- 第六讲 复数和复指数
- 本地搭建wooyun图片无法加载问题解决
- 小心肝队-冲刺日志(第五天)
- JavaScript小白基础学习教程
- 经典算法(2):黄金分割法(Gold)
- C++ 操纵算子原理
- 形参和实参的定义与区别
- [Swift]LeetCode788. 旋转数字 | Rotated Digits
- MyBatis手动SQL分页