Laravel用户授权系统的使用方法示例


Posted in PHP onSeptember 16, 2018

前言

本文主要给大家介绍的是关于Laravel用户授权系统使用的相关内容

首先两个概念分清楚:

用户身份认证 Authentication - 处理用户登录, 退出, 注册, 找回密码, 重置密码, 用户邮箱认证 etc..

权限管理 Authorization - 负责 用户 与 权限, 用户组 三者之间的对应, 以及管理.

下面话不多说了,来一起看看详细的介绍吧

基本用法

示例

$this->authorize('update', $post);

第一个参数 $ability,表示具备什么权限。第二个参数 $post,是一个模型实例。

不需指定模型的动作,比如 create,不需要指定的模型。第二个参数传一个类名。如:

$this->authorize('create', Post::class);

使用的场景有:控制器辅助方法,中间件,Blade模板,User 模型的 can 和 can't 方法。

authorize方法:

public function authorize($ability, $arguments = [])
{
 list($ability, $arguments) = $this->parseAbilityAndArguments($ability, $arguments);
 
 return app(Gate::class)->authorize($ability, $arguments);
}

有两种方式实现用户授权

Gates

编写 Gates

一般在 app\Providers\AuthServiceProvider 的 boot 方法中定义。

Gate::define('update-post', function ($user, $post) {
 return $user->id == $post->user_id;
});

第一个参数是权限的名称,第二个参数是满足权限的条件,可以是闭包,控制器方法。

授权动作

allows 和 denies 两种方法,表示允许和否定。

第一个参数是权限的名称,第二个参数是模型,可以为空。这里不需要传入用户,框架会自动处理。

if (Gate::allows('update-post', $post)) {
 // 指定用户可以更新博客...
}
 
if (Gate::denies('update-post', $post)) {
 // 指定用户不能更新博客...
}

如果需要指定特定用户,可以使用 Gate Facade 中的 forUser 方法:

if (Gate::forUser($user)->allows('update-post', $post)) {
 // 指定用户可以更新博客...
}
 
if (Gate::forUser($user)->denies('update-post', $post)) {
 // 指定用户不能更新博客...
}

策略

生成策略

artisan 命令:

php artisan make:policy PostPolicy

也可以指定 model,生成包含 CURD 的策略方法。

注册策略

在 AuthServiceProvider 的 policies 属性,可以将模型和策略对应起来。如:

protected $policies = [
 Post::class => PostPolicy::class,
];

策略方法

public function update(User $user, Post $post)
{
 return $user->id === $post->user_id;
}

策略方法,就是权限名称,$this->authorize(‘update', $post) 的第一个参数就对应同名的策略方法,第二个参数 $post 代表它是一个 Post 模型,框架会根据参数判断采用 Post::class => PostPolicy::class 这个策略。

当 authorize 方法调用的时候,实际上会自动注入 User 和 Post 类型的两个参数,也因此使用授权系统必须是用户登录的情况下。

使用策略也不一定要和模型绑定,比如这样也可以:

protected $policies = [
 Travel::class => TravelPolicy::class,
 'aaa'=>TravelPolicy::class,
];

这个 aaa 字符串对应策略类为 TravelPolicy::class,在控制器使用 authorize 判断授权:

$this->authorize('update','aaa');

此时也是可行的,第二个参数这个时候就必须是字符串 aaa 了,然后 authorize 方法只会自动注入 User 参数。

官方文档

Laravel 5.5 文档

https://laravel-china.org/docs/laravel/5.5/authorization/1310

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
php实现按照权重随机排序数据的方法
Jan 09 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
php中动态变量用法实例
Jun 10 PHP
php实现计算百度地图坐标之间距离的方法
May 05 PHP
php中二分法查找算法实例分析
Sep 22 PHP
php 无限分类 树形数据格式化代码
Oct 11 PHP
php实现文件与16进制相互转换的方法示例
Feb 16 PHP
php 查找数组元素提高效率的方法详解
May 05 PHP
php检测mysql表是否存在的方法小结
Jul 20 PHP
laravel解决迁移文件一次删除创建字段报错的问题
Oct 24 PHP
Laravel中错误与异常处理的用法示例
Sep 16 #PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 #PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 #PHP
thinkphp5引入公共部分header、footer的方法详解
Sep 14 #PHP
PHP中创建和编辑Excel表格的方法
Sep 13 #PHP
PHP通过get方法获得form表单数据方法总结
Sep 12 #PHP
php获取手机端的号码以及ip地址实例代码
Sep 12 #PHP
You might like
解析:php调用MsSQL存储过程使用内置RETVAL获取过程中的return值
2013/07/03 PHP
PHP微信红包API接口
2015/12/05 PHP
php版微信自动登录并获取昵称的方法
2016/09/23 PHP
Windows平台PHP+IECapt实现网页批量截图并创建缩略图功能详解
2019/08/02 PHP
combox改进版 页面原型参考dojo的,比网上jQuery的那些combox功能强,代码更小
2010/04/15 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
JSON辅助格式化处理方法
2013/03/26 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
微信小程序 swiper制作tab切换实现附源码
2017/01/21 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
Angular路由ui-router配置详解
2018/08/01 Javascript
如何让node运行es6模块文件及其原理详解
2018/12/11 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
[01:02:18]VGJ.S vs infamous Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python 请求服务器的实现代码(http请求和https请求)
2018/05/25 Python
Python引用计数操作示例
2018/08/23 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
PyQt5使用QTimer实现电子时钟
2019/07/29 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
2020/02/11 Python
关于python 跨域处理方式详解
2020/03/28 Python
Python常用外部指令执行代码实例
2020/11/05 Python
python selenium 获取接口数据的实现
2020/12/07 Python
麦德龙官方海外旗舰店:德国麦德龙超市
2017/12/23 全球购物
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
总经理的岗位职责
2014/02/23 职场文书
会计员岗位职责
2014/03/15 职场文书
网络工程专业自荐信范文
2014/03/16 职场文书
违纪学生保证书
2015/02/27 职场文书
《绝招》教学反思
2016/02/20 职场文书
如何写好开幕词?
2019/06/24 职场文书
python基础之爬虫入门
2021/05/10 Python
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL