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数组函数序列之ksort()对数组的元素键名进行升序排序,保持索引关系
Nov 02 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
php实现比较两个文件夹异同的方法
Jun 18 PHP
整理php防注入和XSS攻击通用过滤
Sep 13 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
全面解析PHP操作Memcache基本函数
Jul 14 PHP
CI框架AR数据库操作常用函数总结
Nov 21 PHP
php生成无限栏目树
Mar 16 PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 PHP
微信公众平台开发教程④ ThinkPHP框架下微信支付功能图文详解
Apr 10 PHP
laravel清除视图缓存的代码
Oct 23 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读取javascript设置的cookies的代码
2010/04/12 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
关于jquery input textare 事件绑定及用法学习
2013/04/03 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
JQuery为页面Dom元素绑定事件及解除绑定方法
2014/04/23 Javascript
JavaScript中的ubound函数使用实例
2014/11/04 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
2017/05/14 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
使用jquery DataTable和ajax向页面显示数据列表的方法
2018/08/09 jQuery
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
python开发中range()函数用法实例分析
2015/11/12 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python中functools模块的常用函数解析
2016/06/30 Python
详细介绍Python的鸭子类型
2016/09/12 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
pandas通过字典生成dataframe的方法步骤
2019/07/23 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
工作时间证明
2015/06/15 职场文书
班主任工作经验交流会总结
2015/11/02 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers