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 相关文章推荐
火车采集器 免费版使出收费版本功能实现原理
Sep 17 PHP
Discuz!下Memcache缓存实现方法
May 28 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
ThinkPHP连接数据库及主从数据库的设置教程
Aug 22 PHP
php中try catch捕获异常实例详解
Nov 21 PHP
PHP实现抓取Google IP并自动修改hosts文件
Feb 12 PHP
php支付宝手机网页支付类实例
Mar 04 PHP
ThinkPHP3.2.3数据库设置新特性
Mar 05 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
PHP session 会话处理函数
Jun 06 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
Sep 22 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 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中文乱码
2009/11/26 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
2015/05/09 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
根据地区不同显示时间的javascript代码
2007/08/13 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
table对象中的insertRow与deleteRow使用示例
2014/01/26 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
在Python程序和Flask框架中使用SQLAlchemy的教程
2016/06/06 Python
详解Python 解压缩文件
2019/04/09 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
python实现拉普拉斯特征图降维示例
2019/11/25 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
在spyder IPython console中,运行代码加入参数的实例
2020/04/20 Python
python如何删除文件、目录
2020/06/23 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
Ubuntu20下的Django安装的方法步骤
2021/01/24 Python
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
实习生个人的自我评价
2013/12/08 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
文明城市创建标语
2014/06/16 职场文书
2014年班级工作总结
2014/11/14 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书
网吧员工管理制度
2015/08/05 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
小程序wx.getUserProfile接口的具体使用
2021/06/02 Javascript
Nginx禁止ip访问或非法域名访问
2022/04/07 Servers