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 相关文章推荐
PHP strncasecmp字符串比较的小技巧
Jan 04 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
php汉字转拼音的示例
Feb 27 PHP
PHP常用正则表达式集锦
Aug 17 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
Jan 21 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
PHP单例模式详细介绍
Jul 01 PHP
php通过curl添加cookie伪造登陆抓取数据的方法
Apr 02 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
php处理多图上传压缩代码功能
Jun 13 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命名空间学习详解
2014/02/27 PHP
PHP上传文件时自动分配路径的方法
2015/01/09 PHP
php中删除数组的第一个元素和最后一个元素的函数
2015/03/07 PHP
PHP魔术方法使用方法汇总
2016/02/14 PHP
Json_encode防止汉字转义成unicode的方法
2016/02/25 PHP
PHP高效获取远程图片尺寸和大小的实现方法
2017/10/20 PHP
javascript支持firefox,ie7页面布局拖拽效果代码
2007/12/20 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
Jquery 一次处理多个ajax请求的代码
2011/09/02 Javascript
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
Python BS4库的安装与使用详解
2018/08/08 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
python按比例随机切分数据的实现
2019/07/11 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
使用python 的matplotlib 画轨道实例
2020/01/19 Python
解决jupyter notebook 出现In[*]的问题
2020/04/13 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
Vinatis德国:法国领先的葡萄酒邮购公司
2020/09/07 全球购物
造型师求职自荐信
2013/09/27 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
冰峪沟导游词
2015/02/09 职场文书
北大自主招生自荐信
2015/03/04 职场文书
演讲开场白台词大全
2015/05/29 职场文书
市级三好生竞选稿
2015/11/21 职场文书