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 出现乱码的解决方法
Aug 08 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
基于PHP array数组的教程详解
Jun 05 PHP
浅析php创建者模式
Nov 25 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
Dec 17 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
Oct 26 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP关键特性之命名空间实例详解
May 06 PHP
php7 安装yar 生成docker镜像
May 09 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 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 移除数组重复元素的一点说明
2008/11/27 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
php之readdir函数用法实例
2014/11/13 PHP
php实现插入数组但不影响原有顺序的方法
2015/03/27 PHP
在IIS下安装PHP扩展的方法(超简单)
2017/04/10 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
强制设为首页代码
2006/06/19 Javascript
JavaScript Event学习第八章 事件的顺序
2010/02/07 Javascript
Javascript匿名函数的一种应用 代码封装
2010/06/27 Javascript
jquery 插件开发 extjs中的extend用法小结
2013/01/04 Javascript
IE关闭时判断及AJAX注销案例学习
2013/02/18 Javascript
全面理解面向对象的 JavaScript(来自ibm)
2013/11/10 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
实例讲解DataTables固定表格宽度(设置横向滚动条)
2017/07/11 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
python里对list中的整数求平均并排序
2014/09/12 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python处理图片之PIL模块简单使用方法
2015/05/11 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
在双python下设置python3为默认的方法
2018/10/31 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
SmartBuyGlasses英国:购买太阳镜和眼镜
2018/01/29 全球购物
党委书记岗位职责
2013/11/24 职场文书
临时用工协议书范本
2014/10/29 职场文书
2015年乡镇组织委员工作总结
2015/10/23 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python