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 相关文章推荐
php中强制下载文件的代码(解决了IE下中文文件名乱码问题)
May 09 PHP
PHP仿盗链代码
Jun 03 PHP
浅析PHP的ASCII码转换类
Jul 05 PHP
wordpress自定义url参数实现路由功能的代码示例
Nov 28 PHP
php自动给网址加上链接的方法
Jun 02 PHP
PHP的运行机制与原理(底层)
Nov 16 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
Dec 07 PHP
PHP判断密码强度的方法详解
May 26 PHP
PHP基于堆栈实现的高级计算器功能示例
Sep 15 PHP
PHP如何防止XSS攻击与XSS攻击原理的讲解
Mar 22 PHP
php 函数中静态变量使用的问题实例分析
Mar 05 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
Mar 09 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
Search Engine Friendly的URL设计
2006/10/09 PHP
destoon各类调用汇总
2014/06/20 PHP
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
2017/09/20 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
JavaScript中的排序算法代码
2011/02/22 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
jQuery支持动态参数将函数绑定到事件上的方法
2015/03/17 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
json数据传到前台并解析展示成列表的方法
2018/08/06 Javascript
Vue 权限控制的两种方法(路由验证)
2019/08/16 Javascript
JavaScript canvas基于数组生成柱状图代码实例
2020/03/06 Javascript
通过实例解析JavaScript常用排序算法
2020/09/02 Javascript
javascript实现简易计算器功能
2020/09/23 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
你所不知道的Python奇技淫巧13招【实用】
2016/12/14 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
美国蔬菜和植物种子公司:Burpee
2017/02/01 全球购物
英国领先的大码时装品牌之一:Elvi
2018/08/26 全球购物
eDreams加拿大:廉价航班、酒店和度假
2019/03/29 全球购物
如何强制垃圾回收
2015/10/06 面试题
仓库门卫岗位职责
2013/12/22 职场文书
竞聘自述材料
2014/08/25 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
追悼会家属答谢词
2015/09/29 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
2016年圣诞节活动总结范文
2016/04/01 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android