个人博客:www.saoguang.top
框架版本:Laravel5.5
Laravel-学习笔记-多用户表登陆分析与实现
(Authentication)
前言:根据Laravel的开发文档,只需要下面两条artisan命令就能够构建起一个完整的认证系统,这个认证系统只支持单用户类型。但是很多情况下,我们的网站需要有管理员用户,有时管理员用户还和普通用户的ID不一样,可能普通用户使用邮箱登陆而管理员却不是。这种情况下就可以使用多用户表实现了。Laravel自己生成的作为普通用户,建立的管理员则只需要登陆功能。管理员账号信息使用数据填充加入就行了。
php artisan make:auth
php artisan migrate
整个实现过程都使用自带的User来进行修改。
一、分析Laravel本身User的登陆验证过程。(分析的重点我用蓝色标出)
<表面上分为下面的几个步骤>
1.进入登陆页面
2.验证表单
3.调用Illuminate\Support\Facades\Auth;下的Auth::Guard('guard_name')->attempt(['字段名'=>$对应的输入值,...], $remember)来进行用户认证,也就是验证账号和密码。
4.如果3步中认证通过,就直接重定向到指定页面,(比如管理员重定向到管理员的页面)
<5.如果没登陆管理员的情况下,进入管理员页面,中间件验证没登陆,就重定向到登陆页面>
<6.如果登陆了管理员的情况下,进入登陆页面,中间件验证,如果登陆了就重定向到管理员页面>
<下面来分析下,每个步骤>
1.进入登陆页面
登陆页面当然需要先看路由,执行完上面的两条artisan命令后,路由web.php中会添加两条语句。
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
先看Auth::routes();这个语句包含多个路由,可以去vendor\laravel\framework\src\Illuminate\Routing目录下的Router.php中找到这个函数。
(我们只看登陆和注销的路由,下面的都不看。)可以看出login的get路由调用了LoginController的showLoginForm方法,并路由命名为login。
在这个类的中
返回登陆页面,那么到时候我们新建一个AdminHomeController时就需要重载这个方法,让他返回的是管理员的登陆页面。
2.验证表单
继续看下一条路由。重头戏来了,LoginController@login
找到这个方法,就在上面点。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
这里几个函数分别进去看,
(1)$this->validateLogin($request);
一看就清楚了,这个就是表单验证,这个username()是它的成员方法,默认返回的是email,我们可以重载这个方法,让它返回其他字段,就能作为账号验证字段了。
(2)
这一块的作用从注释中能看出,是负责错误次数记录,以及暂时锁定用户的,这个在文档中叙述入下。
登录限制#
Laravel 内置的控制器 LoginController 已经包含了 Illuminate\Foundation\Auth\ThrottlesLogins trait。
默认情况下,如果用户在进行几次尝试后仍不能提供正确的凭证,该用户将在一分钟内无法进行登录。这个限制
基于用户的用户名/邮件地址和 IP 地址。
3.调用Illuminate\Support\Facades\Auth;下的Auth::Guard('guard_name')->attempt(['字段名'=>$对应的输入值,...], $remember)来进行用户认证,也就是验证账号和密码。
(3)
这里就是登陆验证了,看return语句就知道了。
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
*