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设计模式中的工厂模式
Jun 12 PHP
Smarty的配置与高级缓存技术分享
Jun 05 PHP
PHP中最容易忘记的一些知识点总结
Apr 28 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
May 12 PHP
PHP开发框架kohana3 自定义路由设置示例
Jul 14 PHP
PHP向浏览器输出内容的4个函数总结
Nov 17 PHP
php数组键名技巧小结
Feb 17 PHP
分享自定义的几个PHP功能函数
Apr 15 PHP
PHP date函数常用时间处理方法
May 11 PHP
Laravel框架用户登陆身份验证实现方法详解
Sep 14 PHP
PHP封装的XML简单操作类完整实例
Nov 13 PHP
记Laravel调用Gin接口调用formData上传文件的实现方法
Dec 12 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获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
2009/10/11 PHP
php代码书写习惯优化小结
2013/06/20 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php文件操作小结(删除指定文件/获取文件夹下的文件名/读取文件夹下图片名)
2016/05/09 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
php的4种常用运行方式详解
2016/12/22 PHP
php图片裁剪函数
2018/10/31 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
2015/02/10 Javascript
jQuery实现监控页面所有ajax请求的方法
2015/12/10 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
vue父组件向子组件传递多个数据的实例
2018/03/01 Javascript
json前后端数据交互相关代码
2018/09/19 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
element-ui 时间选择器限制范围的实现(随动)
2019/01/09 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
想学python 这5本书籍你必看!
2018/12/11 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
linux面试题参考答案(5)
2014/09/01 面试题
企业口号大全
2014/06/12 职场文书
经济类毕业生求职信
2014/06/26 职场文书
优秀团支部申报材料
2014/12/26 职场文书
丧事答谢词
2015/01/05 职场文书
大学生求职自荐信
2015/03/24 职场文书
捐书活动倡议书
2015/04/27 职场文书
仰望星空观后感
2015/06/10 职场文书
祝酒词范文
2015/08/12 职场文书
计算机实训心得体会
2016/01/14 职场文书
公文格式,规则明细(新手收藏)
2019/07/23 职场文书
如何将numpy二维数组中的np.nan值替换为指定的值
2021/05/14 Python