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 xml-rpc远程调用
Dec 19 PHP
php 方便水印和缩略图的图形类
May 21 PHP
php异常处理技术,顶级异常处理器
Jun 13 PHP
通过PHP的内置函数,通过DES算法对数据加密和解密
Jun 21 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
PHP中isset()和unset()函数的用法小结
Mar 11 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
在openSUSE42.1下编译安装PHP7 的方法
Dec 24 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
Nov 14 PHP
php输出图像的方法实例分析
Feb 16 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
thinkphp5 模型实例化获得数据对象的教程
Oct 18 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注入实例
2006/10/09 PHP
PHP获取网站域名和地址的代码
2008/08/17 PHP
解析php中var_dump,var_export,print_r三个函数的区别
2013/06/21 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
javascript基础的动画教程,直观易懂
2007/01/10 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
2011/01/09 Javascript
js实现单一html页面两套css切换代码
2013/04/11 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
同步异步动态引入js文件的几种方法总结
2016/09/23 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
JQuery form表单提交前验证单选框是否选中、删除记录时验证经验总结(整理)
2017/06/09 jQuery
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python用模块pytz来转换时区
2016/08/19 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
Python爬虫之pandas基本安装与使用方法示例
2018/08/08 Python
基于python及pytorch中乘法的使用详解
2019/12/27 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
tensorflow自定义激活函数实例
2020/02/04 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
美国创意之家:BulbHead
2017/07/12 全球购物
澳洲网红粉泥面膜:Sand & Sky
2019/08/13 全球购物
Android interview questions
2016/12/25 面试题
2014年大学生党员评议表自我评价
2014/09/20 职场文书
代领报检证委托书范本
2014/10/11 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python