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 相关文章推荐
使用sockets:从新闻组中获取文章(三)
Oct 09 PHP
PHP XML操作类DOMDocument
Dec 16 PHP
php设计模式 Observer(观察者模式)
Jun 26 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
解析htaccess伪静态的规则
Jun 18 PHP
浅析PHP编程中10个最常见的错误
Aug 08 PHP
php采用ajax数据提交post与post常见方法总结
Nov 10 PHP
php版微信发红包接口用法示例
Sep 23 PHP
YII2自动登录Cookie总是失效的解决方法
Jun 28 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
在 Laravel 中 “规范” 的开发短信验证码发送功能
Oct 26 PHP
php使用json-schema模块实现json校验示例
Sep 28 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 str_replace的替换漏洞
2008/03/15 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
Js如何判断客户端是PC还是手持设备简单分析
2012/11/22 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
js判断文本框剩余可输入字数的方法
2015/02/04 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
jQuery解析XML 详解及方法总结
2016/09/28 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
easy ui datagrid 从编辑框中获取值的方法
2017/02/22 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
Vue页面骨架屏注入方法
2018/05/13 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python实现爬取图书封面
2018/07/05 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
python向图片里添加文字
2019/11/26 Python
dpn网络的pytorch实现方式
2020/01/14 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
2020/03/10 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
利用jupyter网页版本进行python函数查询方式
2020/04/14 Python
解决python 虚拟环境删除包无法加载的问题
2020/07/13 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
室内拓展活动方案
2014/02/13 职场文书
考试保密承诺书
2014/08/30 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
会议简讯范文
2015/07/20 职场文书