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 相关文章推荐
为php4加入动态flash文件的生成的支持
Oct 09 PHP
php 8小时时间差的解决方法小结
Dec 22 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
php 注释规范
Mar 29 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
用PHP实现浏览器点击下载TXT文档的方法详解
Jun 02 PHP
php 批量生成html,txt文件的实现代码
Jun 26 PHP
10 个经典PHP函数
Oct 17 PHP
详解WordPress开发中过滤属性以及Sql语句的函数使用
Dec 25 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
Dec 21 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
Jun 09 PHP
php ajax数据传输和响应方法
Aug 21 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 clearstatcache()函数详解
2010/03/02 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
PHP设计模式之责任链模式的深入解析
2013/06/13 PHP
php实现将Session写入数据库
2015/07/26 PHP
浅析jQuery的链式调用之each函数
2010/12/03 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
JQuery简单实现锚点链接的平滑滚动
2015/05/03 Javascript
利用n 升级工具升级Node.js版本及在mac环境下的坑
2017/02/15 Javascript
JS中的作用域链
2017/03/01 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
2018/04/17 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
2018/06/29 Javascript
微信小程序实现左右列表联动
2020/05/19 Javascript
vue模式history下在iis中配置流程
2019/04/17 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
详解Python3.6的py文件打包生成exe
2018/07/13 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
2020/01/10 Python
AUC计算方法与Python实现代码
2020/02/28 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
CSS3中使用RGBA设置透明度的示例
2015/08/04 HTML / CSS
英国领先的互联网葡萄酒礼品商:Vintage Wine & Port
2019/05/24 全球购物
俄罗斯汽车零件和配件在线商店:CarvilleShop
2019/11/29 全球购物
remote接口和home接口主要作用
2013/05/15 面试题
小班上学期评语
2014/05/05 职场文书
书香家庭事迹材料
2014/05/09 职场文书
大学生学习计划书
2014/09/15 职场文书
自查自纠工作总结
2014/10/15 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
学前班教学反思
2016/02/24 职场文书
解决jupyter notebook图片显示模糊和保存清晰图片的操作
2021/04/24 Python
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript