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
支持oicq头像的留言簿(一)
Oct 09 PHP
深入分析php之面向对象
May 15 PHP
php缓存技术详细总结
Aug 07 PHP
php中stream(流)的用法
Mar 25 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
PHP连接SQLServer2005的方法
Jan 27 PHP
Thinkphp+smarty+uploadify实现无刷新上传
Jul 30 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
Laravel利用gulp如何构建前端资源详解
Jun 03 PHP
PHP生成图表pChart的示例解析
Jul 31 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/07/27 PHP
php 随机记录mysql rand()造成CPU 100%的解决办法
2010/05/18 PHP
PHP基于GD库的缩略图生成代码(支持jpg,gif,png格式)
2014/06/19 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
模仿jQuery each函数的链式调用
2009/07/22 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
详解vue-router基本使用
2017/04/18 Javascript
JavaScript中undefined和null的区别
2017/05/03 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
js实现碰撞检测
2021/01/29 Javascript
python3学生名片管理v2.0版
2018/11/29 Python
在pycharm中设置显示行数的方法
2019/01/16 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Python实现线性判别分析(LDA)的MATLAB方式
2019/12/09 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
AmazeUI在模态框中嵌入表单形成模态输入框
2020/08/20 HTML / CSS
我们是伦敦女孩:WalG
2018/01/08 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
C#笔试题集合
2013/06/21 面试题
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
护士岗位职责
2014/02/16 职场文书
《太阳》教学反思
2014/02/21 职场文书
一年级学生期末评语
2014/04/21 职场文书
学校2014年度工作总结
2014/12/06 职场文书
给老婆的道歉信
2015/01/20 职场文书
运动会通讯稿300字
2015/07/20 职场文书
大学同学聚会感言
2015/07/30 职场文书
三十年同学聚会感言
2015/07/30 职场文书
Django分页器的用法你都了解吗
2021/05/26 Python
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers