laravel框架创建授权策略实例分析


Posted in PHP onNovember 22, 2019

本文实例讲述了laravel框架创建授权策略。分享给大家供大家参考,具体如下:

用户只能编辑自己的资料

在完成对未登录用户的限制之后,接下来我们要限制的是已登录用户的操作,当 id 为 1 的用户去尝试更新 id 为 2 的用户信息时,我们应该返回一个 403 禁止访问的异常。在 Laravel 中可以使用 授权策略 (Policy) 来对用户的操作权限进行验证,在用户未经授权进行操作时将返回 403 禁止访问的异常。

1. 创建授权策略

我们可以使用以下命令来生成一个名为 UserPolicy 的授权策略类文件,用于管理用户模型的授权。

php artisan make:policy UserPolicy

所有生成的授权策略文件都会被放置在 app/Policies 文件夹下。

让我们为默认生成的用户授权策略添加 update 方法,用于用户更新时的权限验证。

app/Policies/UserPolicy.php

laravel框架创建授权策略实例分析

update 方法接收两个参数,第一个参数默认为当前登录用户实例,第二个参数则为要进行授权的用户实例。当两个 id 相同时,则代表两个用户是相同用户,用户通过授权,可以接着进行下一个操作。如果 id 不相同的话,将抛出 403 异常信息来拒绝访问。

使用授权策略需要注意以下两点:

  1. 我们并不需要检查 $currentUser 是不是 NULL。未登录用户,框架会自动为其 所有权限 返回 false
  2. 调用时,默认情况下,我们 不需要 传递当前登录用户至该方法内,因为框架会自动加载当前登录用户(接着看下去,后面有例子)。

2. 注册授权策略

Laravel 提供两种注册授权策略的方式,第一种是手动指定,第二种是 Laravel 5.8 新增功能 —— 自动授权注册。为了方便起见,我们会使用第二种。

自动授权默认会假设 Model 模型文件直接存放在 app 目录下,鉴于我们已将模型存放目录修改为 app/Models,接下来还需自定义自动授权注册的规则,修改 boot() 方法:

app/Providers/AuthServiceProvider.php

laravel框架创建授权策略实例分析

授权策略定义完成之后,我们便可以通过在用户控制器中使用 authorize 方法来验证用户授权策略。默认的 App\Http\Controllers\Controller 类包含了 Laravel 的 AuthorizesRequests trait。此 trait 提供了 authorize 方法,它可以被用于快速授权一个指定的行为,当无权限运行该行为时会抛出 HttpException。authorize 方法接收两个参数,第一个为授权策略的名称,第二个为进行授权验证的数据。

我们需要为 edit 和 update 方法加上这行:

laravel框架创建授权策略实例分析

这里 update 是指授权类里的 update 授权方法,$user 对应传参 update 授权方法的第二个参数。正如上面定义 update 授权方法时候提起的,调用时,默认情况下,我们 不需要 传递第一个参数,也就是当前登录用户至该方法内,因为框架会自动加载当前登录用户。

书写的位置如下:

app/Http/Controllers/UsersController.php

laravel框架创建授权策略实例分析

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP伪造referer突破网盘禁止外连的代码
Jun 15 PHP
PHP 字符串分割和比较
Oct 06 PHP
php结合表单实现一些简单功能的例子
Jun 04 PHP
使用PHP遍历文件夹与子目录的函数代码
Sep 26 PHP
优化PHP程序的方法小结
Feb 23 PHP
php注销代码(session注销)
May 31 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
php修改上传图片尺寸的方法
Apr 14 PHP
PHP实现类似于C语言的文件读取及解析功能
Sep 01 PHP
php微信公众号开发之现金红包
Apr 16 PHP
php报错502badgateway解决方法
Oct 11 PHP
laravel框架语言包拓展实现方法分析
Nov 22 #PHP
laravel框架邮箱认证实现方法详解
Nov 22 #PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 #PHP
PHP实现微信提现功能(微信商城)
Nov 21 #PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 #PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 #PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 #PHP
You might like
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
php适配器模式介绍
2012/08/14 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php中get_defined_constants函数用法实例分析
2015/05/12 PHP
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
jquery异步请求实例代码
2011/06/21 Javascript
jquery右下角自动弹出可关闭的广告层
2015/05/08 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
js读取json文件片段中的数据实例
2017/03/09 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
JavaScript ES6箭头函数使用指南
2018/12/30 Javascript
三步实现ionic3点击退出app程序
2019/09/17 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
2019/12/22 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
[42:27]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第三局
2016/03/05 DOTA
python开发之基于thread线程搜索本地文件的方法
2015/11/11 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
Python基于pillow库实现生成图片水印
2020/09/14 Python
详解python对象之间的交互
2020/09/29 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
猎人靴英国官网:Hunter Boots
2017/02/02 全球购物
英国在线照明超市:Castlegate Lights
2019/10/30 全球购物
网络方面基础面试题
2012/11/16 面试题
换届选举主持词
2015/07/03 职场文书
七年级英语教学反思
2016/02/15 职场文书
MySQL 8.0 驱动与阿里druid版本兼容问题解决
2021/07/01 MySQL
java如何实现socket连接方法封装
2021/09/25 Java/Android
Python Numpy库的超详细教程
2022/04/06 Python