Auth认证路由从路由开始,找到源码,然后研究找到282-303之间根目录下的vendor/laravel/framework/src/Illuminate/Routing/Router.php,具体代码如下:/***注册应用程序的典型身份验证路由。**@returnvoid*/publicfunctionauth(){//身份验证路由...$this->get('login','Auth\LoginController@showLoginForm')->name('login');$this->post('登录','Auth\LoginController@login');$this->post('注销','Auth\LoginController@logout');//注册路径...$this->get('register','Auth\RegisterController@showRegistrationForm');$this->post('register','Auth\RegisterController@register');//密码重置路由...$this->get('密码/重置','Auth\ForgotPasswordController@showLinkRequestForm');$this->post('密码/电子邮件','Auth\ForgotPasswordController@sendResetLinkEmail');$this->get('密码/重置/{token}','Auth\ResetPasswordController@showResetForm');$this->post('密码/重置','Auth\ResetPasswordController@reset');}一共有9条路由,三种登录方式,两种注册方式,重设密码的登录方式(login)四种。登录方式分为三种,一种是get方式,一种是两种post方式。很明显,get方法是用来获取登录页面的。这个没什么好说的,其中之一就是POST方法。一个是用来注销的,也就是注销,一个是登录的,也就是loginlogin($this->post('login','AuthLoginController@login');)找到vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php(如果你不知道如何找到源代码,直接编辑即可在浏览器中全局搜索showLoginForm)第23-56行是我们的登录方法/***处理对应用程序的登录请求。**@param\Illuminate\Http\Request$request*@return\Illuminate\Http\Response*/publicfunctionlogin(Request$request){$this->validateLogin($request);}//如果该类使用ThrottlesLogins特性,我们可以自动限制//此应用程序的登录尝试。我们将通过向此应用程序发出这些请求的客户端的用户名和//IP地址来键入它。如果($lockedOut=$this->hasTooManyLoginAttempts($request)){$this->fireLockoutEvent($request);返回$this->sendLockoutResponse($request);}$credentials=$this->credentials($request);如果($this->guard()->attempt($credentials,$request->has('remember'))){return$this->sendLoginResponse($request);}}//如果登录尝试不成功,我们将增加尝试登录的次数//并将用户重定向回登录表单。当然,当此//用户超过他们的最大尝试次数时,他们将被锁定。如果(!$lockedOut){$this->incrementLoginAttempts($request);}返回$this->sendFailedLoginResponse($request);}也就是说,当我们点击页面上的登录按钮时,请求就会提交给这个方法下面看一下登录方法的具体实现。首先,$this->validateLogin($request);具体来说,第58~69行:/***验证用户登录请求。**@param\Illuminate\Http\Request$request*@returnvoid*/protectedfunctionvalidateLogin(Request$request){$this->validate($request,[$this->username()=>'required','密码'=>'必填',]);}这里我们只是检查用户名和密码是否非空,然后返回登录方法。检查后,if($lockedOut=$this->hasTooManyLoginAttempts($request)){$this->fireLockoutEvent($request);return$this->sendLockoutResponse($request);}这个主要是为了限制用户登录失败的次数。如果登录失败次数过多,将限制用户登录。然后,最重要的部分来了。$credentials=$this->credentials($request);具体方法在71~80行,如下:/***从请求中获取需要的授权凭证。**@param\Illuminate\Http\Request$request*@returnarray*/protectedfunctioncredentials(Request$request){return$request->only($this->username(),'password');}这里返回request请求中'$this->username()'的数据,即email字段和password字段然后根据上面得到的数据调用guard()用于用户身份验证if($this->guard()->attempt($credentials,$request->has('remember'))){return$this->sendLoginResponse($request);}byguard()具体代码可以看(第152-160行):/***获取认证时要使用的守卫。**@return\Illuminate\Contracts\Auth\StatefulGuard*/protectedfunctionguard(){returnAuth::guard();}显然,用户具体账户密码的认证是使用laravel的门面(Facades)来实现最终用户authenticationattempt($credentials,$request->has('remember'))最后,if(!$lockedOut){$this->incrementLoginAttempts($request);}return$this->sendFailedLoginResponse($request);如果认证失败,则增加失败次数,并返回相应信息。经过上面的分析,如果我们不想使用laravel自带的认证,我们可以直接使用Laravel的认证类来管理用户认证,例如$email,'password'=>$password])){//身份验证通过...returnredirect()->intended('dashboard');}}}attempt方法接收一个键值数组对作为第一个参数,数组中的值用于从数据表中查找用户,所以,在上面的例子中,将通过值来获取用户电子邮件,如果找到用户,则将存储在数据中的散列密码与传递的散列密码值进行比较,如果两个散列密码之间的匹配将为用户打开经过身份验证的会话。如果身份验证成功,attempt方法将返回true。否则,返回假。重定向器上的intended方法将用户重定向到用户在登录前打算访问的URL,并且在目标URL无效的情况下将回退URI传递给此方法。如果需要,除了用户的电子邮件和密码之外,还可以将其他条件添加到身份验证查询中,例如,我们可以验证用户是否被标记为有效:if(Auth::attempt(['email'=>$email,'password'=>$password,'active'=>1])){//用户是活跃的,不是挂起的,是存在的。}注意:在这些例子中,不限于使用邮箱进行登录认证,这里只是作为演示示例,您可以将其修改为数据库中可用作“用户名”的任何其他字段。最后,如有错误请QQ交流群指出:489832466
