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网站提速三大“软”招
Oct 09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
PHP 高级课程笔记 面向对象
Jun 21 PHP
PHP读取数据库并按照中文名称进行排序实现代码
Jan 29 PHP
php漏洞之跨网站请求伪造与防止伪造方法
Aug 15 PHP
PHP中判断变量为空的几种方法分享
Aug 26 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
php实现批量压缩图片文件大小的脚本
Jul 04 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
php简单判断两个字符串是否相等的方法
Jul 13 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP实现的分页类定义与用法示例
Jul 05 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
全国FM电台频率大全 - 3 河北省
2020/03/11 无线电
PHP 柱状图实现代码
2009/12/04 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php数组随机排序实现方法
2015/06/13 PHP
浅谈PHP面向对象之访问者模式+组合模式
2017/05/22 PHP
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jQuery插件编写步骤详解
2016/06/03 Javascript
bootstrapvalidator之API学习教程
2017/06/29 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
2018/07/11 Javascript
解决LayUI数据表格复选框不居中显示的问题
2019/09/25 Javascript
Vue强制组件重新渲染的方法讨论
2020/02/03 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
python中的函数用法入门教程
2014/09/02 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
python中urlparse模块介绍与使用示例
2017/11/19 Python
深入浅析python 中的匿名函数
2018/05/21 Python
10个Python小技巧你值得拥有
2018/09/29 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python openpyxl使用方法详解
2019/07/18 Python
使用Python实现牛顿法求极值
2020/02/10 Python
Python datetime 如何处理时区信息
2020/09/02 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
德国高端单身人士交友网站:ElitePartner
2018/12/02 全球购物
个人素质的自我评价分享
2013/12/16 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
公务员年度考核评语
2014/12/31 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
电频谱管理的原则是什么
2022/02/18 无线电