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
Dec 14 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php生成图形(Libchart)实例
Nov 06 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
PHP程序员常见的40个陋习,你中了几个?
Nov 20 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
PHP处理会话函数大总结
Aug 05 PHP
PHP 设计模式系列之 specification规格模式
Jan 10 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
PHP扩展安装方法步骤解析
Nov 24 PHP
php中yar框架实例用法讲解
Dec 27 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 抽象类的简单应用
2011/09/06 PHP
PHP获取文件扩展名的4种方法
2015/11/24 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
新页面打开实际尺寸的图片
2006/08/25 Javascript
Js基础学习资料
2010/11/23 Javascript
Javascript根据指定下标或对象删除数组元素
2012/12/21 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
2018/08/01 Javascript
Vue 实现拖动滑块验证功能(只有css+js没有后台验证步骤)
2018/08/24 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
解决vue组件props传值对象获取不到的问题
2019/06/06 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
Python线性回归实战分析
2018/02/01 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python 炫技操作之合并字典的七种方法
2020/04/10 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
如何理解python面向对象编程
2020/06/01 Python
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
酒店销售主管岗位职责
2014/01/04 职场文书
暑期社会实践方案
2014/02/05 职场文书
园林技术专业求职信
2014/07/28 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
小学教师先进事迹材料
2014/12/15 职场文书
同学联谊会邀请函
2019/06/24 职场文书
详解前端任务构建利器Gulp.js使用指南
2021/04/30 Javascript
nginx代理实现静态资源访问的示例代码
2022/07/07 Servers