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+MySQL的聊天室设计
Oct 09 PHP
一个简单的php实现的MySQL数据浏览器
Mar 11 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
Apr 03 PHP
php格式化工具Beautify PHP小小BUG
Apr 24 PHP
PHP 魔术函数使用说明
May 14 PHP
PHP 一个随机字符串生成代码
May 26 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
php使用base64加密解密图片示例分享
Jan 20 PHP
微信公众号模板消息群发php代码示例
Dec 29 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
Mar 23 PHP
PHP重载基础知识回顾
Sep 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脚本的10个技巧(8)
2006/10/09 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP实现图片的等比缩放和Logo水印功能示例
2017/05/04 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
ext jquery 简单比较
2010/04/07 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)
2016/09/23 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
vue axios登录请求拦截器
2018/04/02 Javascript
KOA+egg.js集成kafka消息队列的示例
2018/11/09 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
js 计算图片内点个数的示例代码
2019/04/04 Javascript
[36:33]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第二场 11.29
2020/12/02 DOTA
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
使用Python读取大文件的方法
2018/02/11 Python
Python 生成 -1~1 之间的随机数矩阵方法
2018/08/04 Python
python 去除二维数组/二维列表中的重复行方法
2019/01/23 Python
python 对字典按照value进行排序的方法
2019/05/09 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
解决tensorflow读取本地MNITS_data失败的原因
2020/06/22 Python
浅谈django不使用restframework自定义接口与使用的区别
2020/07/15 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Revolution Beauty美国官网:英国知名化妆品网站
2018/07/23 全球购物
机关单位人员学雷锋心得体会
2014/03/10 职场文书
三八节主持词
2014/03/17 职场文书
揭牌仪式主持词
2014/03/19 职场文书
师德师风学习材料
2014/12/19 职场文书
浪漫的婚礼主持词
2015/06/30 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python
Pandas 数据编码的十种方法
2022/04/20 Python