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 接口类与抽象类的实际作用
Nov 26 PHP
php+mysql 实现身份验证代码
Mar 24 PHP
PHP垃圾回收机制简单说明
Jul 22 PHP
PHP header()函数使用详细(301、404等错误设置)
Apr 17 PHP
input file获得文件根目录简单实现
Apr 26 PHP
php实现图形显示Ip地址的代码及注释
Jan 20 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
Jan 27 PHP
php 在字符串指定位置插入新字符的简单实现
Jun 28 PHP
php curl获取到json对象并转成数组array的方法
May 31 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
php利用array_search与array_column实现二维数组查找
Jul 08 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
php中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
php 中文处理函数集合
2008/08/27 PHP
php设计模式 Proxy (代理模式)
2011/06/26 PHP
ini_set的用法介绍
2014/01/07 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
jQuery点击按钮弹出遮罩层且内容居中特效
2015/12/14 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
2017/01/16 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
JavaScript中防止微信浏览器被整体拖动的方法
2017/08/25 Javascript
基于vue中对鼠标划过事件的处理方式详解
2018/08/22 Javascript
Vue Element UI + OSS实现上传文件功能
2019/07/31 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
Python学习之用pygal画世界地图实例
2017/12/07 Python
python 接口测试response返回数据对比的方法
2018/02/11 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
Python 带有参数的装饰器实例代码详解
2018/12/06 Python
python七夕浪漫表白源码
2019/04/05 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
python爬取youtube视频的示例代码
2021/03/03 Python
HTML5获取当前地理位置并在百度地图上展示的实例
2020/07/10 HTML / CSS
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
"序列点" 是什么
2016/07/29 面试题
单位承诺书格式
2014/05/21 职场文书
出纳工作检讨书
2014/10/18 职场文书
给校长的建议书作文400字
2015/09/14 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
Python实战之实现简易的学生选课系统
2021/05/25 Python
opencv-python图像配准(匹配和叠加)的实现
2021/06/23 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers