Laravel 自动生成验证的实例讲解:login / logout


Posted in PHP onOctober 14, 2019

Laravel 自动授权讲解

看到这部分文档,经常看见的一句话就是php artisan make:auth,经常好奇这段代码到底干了什么,现在就来扒一扒。

路由

路由文件中会新加入以下内容:

Auth::routes();
Route::get('/home','HomeController@index')->name('home');

首先先是Auth::route();,这句代码等于以下全部设置(文件位置是\Illuminate\Routing\Router.php):

/**
  * Register the typical authentication routes for an application.
  *
  * @return void
  */
 public function auth()
 {
  // Authentication Routes...
  $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
  $this->post('login', 'Auth\LoginController@login');
  $this->post('logout', 'Auth\LoginController@logout')->name('logout');

  // Registration Routes...
  $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
  $this->post('register', 'Auth\RegisterController@register');

  // Password Reset Routes...
  $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,这里贴一下他的代码:

class LoginController extends Controller
{
 /*
 |--------------------------------------------------------------------------
 | Login Controller
 |--------------------------------------------------------------------------
 |
 | This controller handles authenticating users for the application and
 | redirecting them to your home screen. The controller uses a trait
 | to conveniently provide its functionality to your applications.
 |
 */

 use AuthenticatesUsers;

 /**
  * Where to redirect users after login.
  *
  * @var string
  */
 protected $redirectTo = '/home';

 /**
  * Create a new controller instance.
  *
  * @return void
  */
 public function __construct()
 {
  $this->middleware('guest')->except('logout');
 }
}

而其中并没有设置showLoginForm方法,该方法被保存在trait AuthenticatesUsers中,该方法的代码如下:

public function showLoginForm()
 {
  return view('auth.login');
 }

就是返回一个视图,下面我们来看该视图:

<form class="form-horizontal" method="POST" action="{{ route('login') }}">
</form>

而其中最重要的就是看这个表单被提交到了哪里,结合上面的路由表,可以看到是

public function login(Request $request)
 {
  $this->validateLogin($request);
  /**
  *
  protected function validateLogin(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 的介绍可以看我上一篇博客
  protected function attemptLogin(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进行验证。

退出操作的代码如下:

public function logout(Request $request)
 {
  $this->guard()->logout();

  $request->session()->invalidate();

  return redirect('/');
 }

$this->guard()的代码如下:

protected function guard()
 {
  return Auth::guard();
 }

logout的具体的执行代码如下,别问我怎么找到的,PHPStorm的全项目文本搜索不解释:\Illuminate\Auth\SessionGuard.php:

public function logout()
 {
  $user = $this->user();

  $this->clearUserDataFromStorage();

  if (! is_null($this->user)) {
   $this->cycleRememberToken($user);
  }

  if (isset($this->events)) {
   $this->events->dispatch(new Events\Logout($user));
  }

  // Once we have fired the logout event we will clear the users out of memory
  // so they are no longer available as the user is no longer considered as
  // being signed into this application and should not be available here.
  $this->user = null;

  $this->loggedOut = true;
 }

其中牵扯很多,那么我换种角度考虑,假设我们不考虑logout()的具体实现,而是思考如何制作自己的退出设置,那么该如何修改源码呢?好像直接修改成下面的形式就可以了:

public function logout(Request $request)
 {
  Auth::guard()->logout();

  $request->session()->invalidate();
  // 自定义重定向地址
  return redirect('/');
 }

其中的很多内容都跟我们的设置无关,全自动的调用,所以我们的退出按钮就只需要运行上述代码即可。本人请测有效。

以上这篇Laravel 自动生成验证的实例分析:login / logout就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
Snoopy类使用小例子
Apr 15 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
使用PHP备份MYSQL数据的多种方法
Jan 15 PHP
php导出excel格式数据问题
Mar 11 PHP
PHP中file_exists()判断中文文件名无效的解决方法
Nov 12 PHP
解决出现SoapFault (looks like we got no XML document)的问题
Jun 24 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
YII框架中使用memcache的方法详解
Aug 02 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 PHP
Yii框架getter与setter方法功能与用法分析
Oct 22 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 PHP
Yii 框架控制器创建使用及控制器响应操作示例
Oct 14 #PHP
Laravel 登录后清空COOKIE的操作方法
Oct 14 #PHP
Yii框架Session与Cookie使用方法示例
Oct 14 #PHP
laravel 修改记住我功能的cookie保存时间的方法
Oct 14 #PHP
解决laravel session失效的问题
Oct 14 #PHP
Yii框架视图、视图布局、视图数据块操作示例
Oct 14 #PHP
laravel 5.3 单用户登录简单实现方法
Oct 14 #PHP
You might like
php面向对象全攻略 (五) 封装性
2009/09/30 PHP
smarty模板引擎之分配数据类型
2015/03/30 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
js 函数的副作用分析
2011/08/23 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
js中的事件委托或是事件代理使用详解
2017/06/23 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
Array数组对象中的forEach、map、filter及reduce详析
2018/08/02 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
2018/08/09 Javascript
layui--select使用以及下拉框实现键盘选择的例子
2019/09/24 Javascript
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
2020/01/02 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
原生js滑动轮播封装
2020/07/31 Javascript
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
[47:10]完美世界DOTA2联赛PWL S3 LBZS vs Rebirth 第二场 12.16
2020/12/18 DOTA
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
python根据多个文件名批量查找文件
2019/08/13 Python
jupyter notebook 多行输出实例
2020/04/09 Python
Python爬虫使用bs4方法实现数据解析
2020/08/25 Python
Python与C/C++的相互调用案例
2021/03/04 Python
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
UNIX文件系统分类
2014/11/11 面试题
海飞丝的广告词
2014/03/20 职场文书
2014年乡镇工会工作总结
2014/12/02 职场文书
2015毕业寄语大全
2015/02/26 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
导游词之杭州岳王庙
2019/11/13 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python