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 zip文件解压类代码
Dec 02 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
php 错误处理经验分享
Oct 11 PHP
PHP修改session_id示例代码
Jan 08 PHP
PHP新建类问题分析及解决思路
Nov 19 PHP
变量在 PHP7 内部的实现(二)
Dec 21 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 PHP
PHP实现随机发扑克牌
Apr 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新手上路(四)
2006/10/09 PHP
php json相关函数用法示例
2017/03/28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
浏览器常用高宽的jquery插件
2011/02/24 Javascript
JavaScript入门之对象与JSON详解
2011/10/21 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js 验证密码强弱的小例子
2013/03/21 Javascript
js+html5实现canvas绘制圆形图案的方法
2015/06/05 Javascript
让JavaScript中setTimeout支持链式操作的方法
2015/06/19 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
2016/09/08 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
2016/09/17 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
在点击div中的p时,如何阻止事件冒泡
2017/02/07 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
ES6中Set和Map用法实例详解
2020/03/02 Javascript
jQuery-App输入框实现实时搜索
2020/11/19 jQuery
基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件功能
2021/02/23 Vue.js
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
Pycharm更换python解释器的方法
2018/10/29 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
元旦晚会策划方案
2014/02/18 职场文书
教学质量评估实施方案
2014/03/17 职场文书
四年级评语大全
2014/04/21 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2015年党风建设工作总结
2015/04/29 职场文书
2016年度农村党员干部主题教育活动总结
2016/04/06 职场文书
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技