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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
PHP Array交叉表实现代码
Aug 05 PHP
php加速器eAccelerator的配置参数、API详解
May 05 PHP
PHP APC配置文件2套和参数详解
Jun 11 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php中使用gd库实现远程图片下载实例
May 12 PHP
用php和jQuery来实现“顶”和“踩”的投票功能
Oct 13 PHP
PHP实现向关联数组指定的Key之前插入元素的方法
Jun 06 PHP
PDO::query讲解
Jan 29 PHP
laravel 出现command not found问题的解决方案
Oct 23 PHP
PHP设计模式(九)外观模式Facade实例详解【结构型】
May 02 PHP
解决PhpStorm64不能启动的问题
Jun 20 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对象类型判断
2008/08/27 PHP
PHP内核探索:变量存储与类型使用说明
2014/01/30 PHP
php判断是否为json格式的方法
2014/03/04 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
js中判断文本框是否为空的两种方法
2011/07/31 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
JavaScript如何从listbox里同时删除多个项目
2013/10/12 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
js倒计时抢购实例
2015/12/20 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
详解vue2.0模拟后台json数据
2019/05/16 Javascript
详解element-ui表格中勾选checkbox,高亮当前行
2019/09/02 Javascript
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
Python中enumerate函数代码解析
2017/10/31 Python
python实现日常记账本小程序
2018/03/10 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
安装docker-compose的两种最简方法
2019/07/30 Python
Python3.7 pyodbc完美配置访问access数据库
2019/10/03 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
Ajax的优点和缺点
2014/11/21 面试题
自我评价中英文语句
2013/11/30 职场文书
中专三年学习的个人自我评价
2013/12/12 职场文书
高等教育学专业自荐书
2014/06/17 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
紫日观后感
2015/06/05 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
SpringBoot2零基础到精通之数据库专项精讲
2022/03/22 Java/Android
【TED出品】天梯非主流开心游1700 划水骑士
2022/03/31 魔兽争霸
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers