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动态创建Flash动画
Oct 09 PHP
PHP+APACHE实现用户论证的方法
Oct 09 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
php 数组使用详解 推荐
Jun 02 PHP
PHP类中的魔术方法(Magic Method)简明总结
Jul 08 PHP
php使用$_POST或$_SESSION[]向js函数传参
Sep 16 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
php的instanceof和判断闭包Closure操作示例
Jan 26 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/12/11 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
Symfony学习十分钟入门经典教程
2016/02/03 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
PHP数据对象PDO操作技巧小结
2016/09/27 PHP
php中array_slice和array_splice函数解析
2016/10/18 PHP
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
js如何调用qq互联api实现第三方登录
2014/03/28 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
onclick和onblur冲突问题的快速解决方法
2016/04/28 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
bootstrap 模态框(modal)实现水平垂直居中显示
2017/01/23 Javascript
微信小程序之滚动视图容器的实现方法
2017/09/26 Javascript
mongoose更新对象的两种方法示例比较
2017/12/19 Javascript
Vue框架之goods组件开发详解
2018/01/25 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
使用VScode 插件debugger for chrome 调试react源码的方法
2019/09/13 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
[05:36]DOTA2 2015国际邀请赛中国区预选赛第四日TOP10
2015/05/29 DOTA
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
在Django的session中使用User对象的方法
2015/07/23 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
详解Python使用Plotly绘图工具,绘制甘特图
2019/04/02 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
给酒店员工的表扬信
2014/01/11 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
毕业论文指导教师评语
2014/12/30 职场文书
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android