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数组
Oct 09 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
探讨如何在PHP开启gzip页面压缩实例
Jun 09 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
PHP判断字符串长度的两种方法很实用
Sep 22 PHP
PHP实现GIF图片验证码
Nov 04 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
Apr 15 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
php获取ajax的headers方法与内容实例
Dec 27 PHP
PHP的mysqli_sqlstate()函数讲解
Jan 23 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 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中foreach循环中使用引用要注意的地方
2011/01/02 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
PHP简单生成缩略图相册的方法
2015/07/29 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
再谈querySelector和querySelectorAll的区别与联系
2012/04/20 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
实例讲解JS中数组Array的操作方法
2014/05/09 Javascript
一个JavaScript用逗号分割字符串实例
2014/09/22 Javascript
JavaScript实现的一个日期格式化函数分享
2014/12/06 Javascript
jquery操作select方法汇总
2015/02/05 Javascript
JS 日期与时间戮相互转化的简单实例
2016/06/22 Javascript
Angular JS数据的双向绑定详解及实例
2016/12/31 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
2017/01/13 Javascript
jquery实现input框获取焦点的方法
2017/02/06 Javascript
canvas压缩图片转换成base64格式输出文件流
2017/03/09 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
AngularJS实现与后台服务器进行交互的示例讲解
2018/08/13 Javascript
解决微信小程序调用moveToLocation失效问题【超简单】
2019/04/12 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
Python检查ping终端的方法
2019/01/26 Python
Python restful框架接口开发实现
2020/04/13 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
python 装饰器的实际作用有哪些
2020/09/07 Python
关于CSS Tooltips(鼠标经过时显示)的效果
2013/04/10 HTML / CSS
CSS3 animation实现逐帧动画效果
2016/06/02 HTML / CSS
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
英文自荐信
2013/12/19 职场文书
校长四风对照检查材料
2014/09/27 职场文书
干部培训工作总结2015
2015/05/25 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
MATLAB 如何求取离散点的曲率最大值
2021/04/16 Python