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日期转时间戳,指定日期转换成时间戳
Jul 17 PHP
PHP中session变量的销毁
Feb 27 PHP
php jsonp单引号转义
Nov 23 PHP
php中关于socket的系列函数总结
May 18 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
Aug 18 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
Apr 16 PHP
php + WebUploader实现图片批量上传功能
May 06 PHP
浅谈laravel中的关联查询with的问题
Oct 10 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
php使用fsockopen函数发送post,get请求获取网页内容的方法
2014/11/15 PHP
PHP callback函数使用方法和注意事项
2015/01/23 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
JS小功能(button选择颜色)简单实例
2013/11/29 Javascript
JavaScript四种调用模式和this示例介绍
2014/01/02 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
Node.js中创建和管理外部进程详解
2014/08/16 Javascript
jQuery使用hide方法隐藏元素自身用法实例
2015/03/30 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
JavaScript位移运算符(无符号) >>> 三个大于号 的使用方法详解
2016/03/31 Javascript
利用jsonp跨域调用百度js实现搜索框智能提示
2016/08/24 Javascript
vuejs实现递归树型菜单组件
2018/01/13 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
使用异步组件优化Vue应用程序的性能
2019/04/28 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
PyQt5每天必学之单行文本框
2018/04/19 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
django从请求到响应的过程深入讲解
2018/08/01 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
2020/06/27 Python
matplotlib 画双轴子图无法显示x轴的解决方法
2020/07/27 Python
python中Mako库实例用法
2020/12/31 Python
回门宴新郎答谢词
2014/01/12 职场文书
前厅部经理岗位职责范文
2014/02/04 职场文书
一分钟演讲稿
2014/04/30 职场文书