Laravel 自动生成验证的实例讲解:login / logout
Laravel自动授权讲解
看到这部分文档,经常看见的一句话就是phpartisanmake:auth,经常好奇这段代码到底干了什么,现在就来扒一扒。
路由
路由文件中会新加入以下内容:
Auth::routes(); Route::get('/home','HomeController@index')->name('home');
首先先是Auth::route();,这句代码等于以下全部设置(文件位置是\Illuminate\Routing\Router.php):
/** *Registerthetypicalauthenticationroutesforanapplication. * *@returnvoid */ publicfunctionauth() { //AuthenticationRoutes... $this->get('login','Auth\LoginController@showLoginForm')->name('login'); $this->post('login','Auth\LoginController@login'); $this->post('logout','Auth\LoginController@logout')->name('logout'); //RegistrationRoutes... $this->get('register','Auth\RegisterController@showRegistrationForm')->name('register'); $this->post('register','Auth\RegisterController@register'); //PasswordResetRoutes... $this->get('password/reset','Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request'); $this->post('password/email','Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email'); $this->get('password/reset/{token}','Auth\ResetPasswordController@showResetForm')->name('password.reset'); $this->post('password/reset','Auth\ResetPasswordController@reset'); }
这一部分先讲注册,首先,可以看到登录(login)的路由指向的是Auth\LoginController@showLoginForm,这个控制器是app\Http\Auth\LoginController.php,这里贴一下他的代码:
classLoginControllerextendsController { /* |-------------------------------------------------------------------------- |LoginController |-------------------------------------------------------------------------- | |Thiscontrollerhandlesauthenticatingusersfortheapplicationand |redirectingthemtoyourhomescreen.Thecontrollerusesatrait |toconvenientlyprovideitsfunctionalitytoyourapplications. | */ useAuthenticatesUsers; /** *Wheretoredirectusersafterlogin. * *@varstring */ protected$redirectTo='/home'; /** *Createanewcontrollerinstance. * *@returnvoid */ publicfunction__construct() { $this->middleware('guest')->except('logout'); } }
而其中并没有设置showLoginForm方法,该方法被保存在traitAuthenticatesUsers中,该方法的代码如下:
publicfunctionshowLoginForm() { returnview('auth.login'); }
就是返回一个视图,下面我们来看该视图:
而其中最重要的就是看这个表单被提交到了哪里,结合上面的路由表,可以看到是
publicfunctionlogin(Request$request) { $this->validateLogin($request); /** * protectedfunctionvalidateLogin(Request$request) { $this->validate($request,[ $this->username()=>'required|string', 'password'=>'required|string', ]); } 其中$this->username()就是return'email'; **/ //限制请求次数,防止暴力破解的 if($this->hasTooManyLoginAttempts($request)){ $this->fireLockoutEvent($request); return$this->sendLockoutResponse($request); } /** //关于attempt的介绍可以看我上一篇博客 protectedfunctionattemptLogin(Request$request) { return$this->guard()->attempt( $this->credentials($request),$request->has('remember') ); } **/ //如果验证通过的话 if($this->attemptLogin($request)){ return$this->sendLoginResponse($request); } //否则的话增加验证的统计次数 $this->incrementLoginAttempts($request); //返回错误信息 return$this->sendFailedLoginResponse($request); }
可以看到验证的重点还是Auth::attempt()函数,而且默认是使用email进行验证。
退出操作的代码如下:
publicfunctionlogout(Request$request) { $this->guard()->logout(); $request->session()->invalidate(); returnredirect('/'); }
$this->guard()的代码如下:
protectedfunctionguard() { returnAuth::guard(); }
logout的具体的执行代码如下,别问我怎么找到的,PHPStorm的全项目文本搜索不解释:\Illuminate\Auth\SessionGuard.php:
publicfunctionlogout() { $user=$this->user(); $this->clearUserDataFromStorage(); if(!is_null($this->user)){ $this->cycleRememberToken($user); } if(isset($this->events)){ $this->events->dispatch(newEvents\Logout($user)); } //Oncewehavefiredthelogouteventwewillcleartheusersoutofmemory //sotheyarenolongeravailableastheuserisnolongerconsideredas //beingsignedintothisapplicationandshouldnotbeavailablehere. $this->user=null; $this->loggedOut=true; }
其中牵扯很多,那么我换种角度考虑,假设我们不考虑logout()的具体实现,而是思考如何制作自己的退出设置,那么该如何修改源码呢?好像直接修改成下面的形式就可以了:
publicfunctionlogout(Request$request) { Auth::guard()->logout(); $request->session()->invalidate(); //自定义重定向地址 returnredirect('/'); }
其中的很多内容都跟我们的设置无关,全自动的调用,所以我们的退出按钮就只需要运行上述代码即可。本人请测有效。
以上这篇Laravel自动生成验证的实例分析:login/logout就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。