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 相关文章推荐
来自phpguru得Php Cache类源码
Apr 15 PHP
PHP STRING 陷阱原理说明
Jul 24 PHP
奉献出一个封装的curl函数 便于调用(抓数据专用)
Jul 22 PHP
一个PHP针对数字的加密解密类
Mar 20 PHP
ThinkPHP应用模式扩展详解
Jul 16 PHP
PHP 正则表达式小结
Feb 12 PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 PHP
PHP中如何判断exec函数执行成功?
Aug 04 PHP
php正则判断是否为合法身份证号的方法
Mar 16 PHP
在laravel中使用Symfony的Crawler组件分析HTML
Jun 19 PHP
php layui实现前端多图上传实例
Jul 30 PHP
使用laravel根据用户类型来显示或隐藏字段
Oct 17 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文件下载类
2006/12/06 PHP
PHP 危险函数解释 分析
2009/04/22 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
Drupal读取Excel并导入数据库实例
2014/03/02 PHP
解决CodeIgniter伪静态失效
2014/06/09 PHP
js、jquery图片动画、动态切换示例代码
2014/06/03 Javascript
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
浅谈几种常用的JS类定义方法
2016/06/08 Javascript
vue.js源代码core scedule.js学习笔记
2017/07/03 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
微信小程序自定义多列选择器使用详解
2019/06/21 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vue项目使用.env文件配置全局环境变量的方法
2019/10/24 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
Python利用Django如何写restful api接口详解
2018/06/08 Python
Python3.6简单反射操作示例
2018/06/14 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
如何理解python面向对象编程
2020/06/01 Python
python属于软件吗
2020/06/18 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
CSS3属性选择符介绍
2008/10/17 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
酒店实习个人鉴定
2013/12/07 职场文书
理财投资建议书
2014/03/12 职场文书
2014年维稳工作总结
2014/11/18 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
情侣之间的道歉短信
2015/05/12 职场文书