Laravel多用户认证系统示例详解


Posted in PHP onMarch 13, 2018

前言

自从Laravel5.2开始,自带的Auth认证系统可以支持多个角色认证了。就是说你比如果有管理员、普通用户这两种角色,都可以通过同一个Auth系统来实现认证。

本文将详细给大家介绍关于Laravel多用户认证系统的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。

#1 自动生成代码

Laravel自带的Auth可以通过一行命令来生成相关的认证控制器、模版以及路由:

php artisan make:auth

这样就会生成一个AuthController认证控制器和HomeController通用控制器,这个控制器没什么用,就是登录成功后跳转的;还有就是一些登录注册需要的模版文件,在resource/view里面看看就知道了;而且还会在路由文件中生成相关认证路由,源代码在\Illuminate\Routing\Router::auth(); ,其实就是配置了一些登录注册用的:

public function auth() { 
 // Authentication Routes... 
 $this->get('login', 'Auth\AuthController@showLoginForm'); 
 $this->post('login', 'Auth\AuthController@login'); 
 $this->get('logout', 'Auth\AuthController@logout'); 
 // Registration Routes... 
 $this->get('register', 'Auth\AuthController@showRegistrationForm'); 
 $this->post('register', 'Auth\AuthController@register'); 
 // Password Reset Routes... 
 $this->get('password/reset/{token?}', 'Auth\PasswordController@showResetForm'); 
 $this->post('password/email', 'Auth\PasswordController@sendResetLinkEmail'); 
 $this->post('password/reset', 'Auth\PasswordController@reset'); 
}

#2 auth.php文件配置

这个是和认证相关的配置文件,估计很多人看不懂里面一些概念,比如说guard以及provider
这些,文档也基本上是没写。那么guard到底是什么东西呢?这个可以理解为就是一个角色,在guards
数组中的每一项都是一个角色,默认的有web和api两种,这就表示了当前有这两种角色会使用到认证系统。当然,这两种肯定是不会满足我们要求的,所以我们一般都会自定义一些guard。自定义也很简单,就是在guards数组增加一项,其中driver就是表示这个认证要怎么去保存用户状态,一般是保存在session中,而provider就是下面provider数组的一项,那么provider又是什么鬼呢?这个更好理解了,你要实现用户认证肯定要保存用户名密码对吧,那么provider就是告诉Laravel你的用户信息保存在哪一张表里面,driver就是告诉了要使用那种方式来操作数据库。

#3 认证

其实Laravel自动生成的代码已经可以满足登录注册的需求了,但是每一个guard都需要一个AuthController来,那么如何公用一个认证控制器呢?这里就是用到guard这个东西了,因为可以表示用户身份来进行不同的逻辑。但是,在认证控制器中无法获取到这guard,所以我们可以通过路由参数的方式来实现。定义一个路由群组:

Route::group(['prefix'=>'{guard}'],function(){ Route::auth();});

在这个路由群组中我们设置前缀为guard参数,这样就可以在AuthController中获取到当前的guard了。一般情况下我们获取路由参数都是通过依赖注入Request实例来获取,但是这里也有一个坑那就是我在5.1版本之前路由参数都可以通过

$request->input('key')

这样来获取,但是在5.2中已经不行了,必须通过

$request->key

来获取,或者就是直接从路由实例中获取,不知道这是什么原因。在AuthController控制器中使用了一些trait,这些trait就是实现了认证注册的逻辑,可以通过重写一些控制器的属性来自定义逻辑。包括$redirectTo还有$guard以及$username等等,这些一看就知道第一个是登录成功后跳转,第二个就是定义当前使用的guard,第三个就是认证使用的用户名字段。所以我们可以在认证控制器中通过获取到的guard来自定义。

#4 路由保护

一般做认证系统的,都是要来保护路由的,那么如何保护路由呢?文档里面说给需要保护的路由添加一个auth中间件,那么事实是怎样的呢?事实也确实是这样,不过文档没有说的一点是,通过auth中间件保护的路由必须还要加上web中间件、必须还要加上web中间件、必须还要加上web中间件,重要的事情要说三遍啊,不然会出现什么问题呢?不管你认证成功失败都是会跳转到/这条路由,这个大坑要注意!当然你也可以在中间件中指定guard来让Laravel知道通过那个来认证,如果没指定的话就是使用配置文件里面默认的:

Route::get('profile', [ 'middleware' => 'auth:api', 'uses' => 'ProfileController@show']);

#5 获取用户实例

通过认证后就可以通过Auth门面来获取到当前通过认证的用户实例。

$user = Auth::user();

这里还有一个要注意的是,以上的方式默认获取的是配置文件中的guard的,假如你当前登录的guard不是配置文件中的,就必须要这样子来获取:

$user = Auth::guard('guard')->user();

#6 总结

总得来说,Laravel5.2自带的Auth系统还是很好用的,只是有一些小坑文档没说清楚,用过几次之后就可以很熟悉了,可以给我们节约很多的开发时间。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php 高性能书写
Dec 11 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
PHP之APC缓存详细介绍 apc模块安装
Jan 13 PHP
详解php设置session(过期、失效、有效期)
Nov 12 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
微信支付开发交易通知实例
Jul 12 PHP
PHP mysqli_free_result()与mysqli_fetch_array()函数详解
Sep 21 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
Nov 03 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
php中如何执行linux命令详解
Nov 06 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 PHP
PHP简单实现防止SQL注入的方法
Mar 13 #PHP
PHP+JS实现的实时搜索提示功能
Mar 13 #PHP
PHP实现的简单路由和类自动加载功能
Mar 13 #PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 #PHP
php把字符串指定字符分割成数组的方法
Mar 12 #PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 #PHP
php取出数组单个值的方法
Mar 12 #PHP
You might like
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
AngualrJS中每次$http请求时的一个遮罩层Directive
2016/01/26 Javascript
jQuery的 $.ajax防止重复提交的两种方法(推荐)
2016/10/14 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
webpack 2的react开发配置实例代码
2017/07/28 Javascript
微信小程序实现鼠标拖动效果示例
2017/12/01 Javascript
详解微信小程序实现WebSocket心跳重连
2018/07/31 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
python学习之matplotlib绘制散点图实例
2017/12/09 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python openpyxl使用方法详解
2019/07/18 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
python MultipartEncoder传输zip文件实例
2020/04/07 Python
使用 CSS3 中@media 实现网页自适应的示例代码
2020/03/24 HTML / CSS
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
安全协议书范本
2014/04/21 职场文书
城市规划应届毕业生自荐信
2014/07/04 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
悬空寺导游词
2015/02/05 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
小学生红领巾广播稿
2015/08/19 职场文书
学会Python数据可视化必须尝试这7个库
2021/06/16 Python
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL