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验证码类(分享)
Aug 06 PHP
php实现执行某一操作时弹出确认、取消对话框
Dec 30 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
PHP读取汉字的点阵数据
Jun 22 PHP
js代码实现微博导航栏
Jul 30 PHP
PHP中两个float(浮点数)比较实例分析
Sep 27 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
thinkPHP5.0框架独立配置与动态配置方法
Mar 17 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
详解PHP中curl_multi并发的实现
Jun 08 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
如何用C语言编写PHP扩展的详解
2013/06/13 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
jquery索引在使用中的一些困惑
2013/10/24 Javascript
js保留小数点后几位的写法
2014/01/03 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
Angularjs中$http以post请求通过消息体传递参数的实现方法
2016/08/05 Javascript
javascript匀速动画和缓冲动画详解
2016/10/20 Javascript
原生js实现可拖拽效果
2017/02/28 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
angular2实现统一的http请求头方法
2018/08/13 Javascript
js设置鼠标悬停改变背景色实现详解
2019/06/26 Javascript
基于JS实现数字动态变化显示效果附源码
2019/07/18 Javascript
windows系统下Python环境的搭建(Aptana Studio)
2017/03/06 Python
Python实现KNN邻近算法
2021/01/28 Python
关于python写入文件自动换行的问题
2018/06/23 Python
python实现事件驱动
2018/11/21 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
python手写均值滤波
2020/02/19 Python
python pymysql链接数据库查询结果转为Dataframe实例
2020/06/05 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
网络维护中文求职信
2014/01/03 职场文书
宣传活动总结范文
2014/07/01 职场文书
党员四风问题对照检查材料
2014/09/27 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
社区务虚会发言材料
2014/10/20 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
村党的群众路线教育实践活动总结材料
2014/10/31 职场文书
实习感想范文
2015/08/10 职场文书
Mysql 性能监控及调优
2021/04/06 MySQL