Laravel 5.3 用户验证源码探究 (一) 路由与注册
https://blog.csdn.net/realghost/article/details/52558962
简介
Laravel 从 5.2 开始就有了开箱即用的用户验证,5.3 又在 5.2 的基础上又有了一些改变。为了深入了解具体的用户验证实现,只能深入 Laravel 的源码,探究用户验证是怎么处理的。
开始
安装好 Laravel 5.3 的框架后,执行下面的命令
php artisan make:auth
该命令会在项目里添加以下文件(目录)
app/Http/Controller/HomeController.php
resources/views/auth/
resources/views/auth/login.blade.php
resources/views/auth/passwords/
resources/views/auth/passwords/email.blade.php
resources/views/auth/passwords/reset.blade.php
resources/views/auth/register.blade.php
resources/views/home.blade.php
resources/views/layouts/
resources/views/layouts/app.blade.php
除了一个 HomeController 是处理用户登陆之后的逻辑,其他都是一些视图,用于显示相应的页面。
在 routes/web.php 里添加了以下内容
Auth::routes();
Route::get(‘/home’, ‘HomeController@index’);
Auth::routes() 是登陆、注册需要的一些路由;下面是定义一个 /home 路由,交给 HomeController@index 处理。
那么,就从路由开始我们的探究之旅吧。
路由
我们首先看看 Auth::routes(),定义在 vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php:
public static function routes()
{
static::$app->make('router')->auth();
}
这里由 IoC 容器 解析了一个 Illuminate\Routing\Router 类的实例,再调用里面的 auth() 方法。
我们再来看看 auth() 方法,定义在 vendor/laravel/framework/src/Illuminate/Routing/Router.php:
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'); // Registration Routes...
$this->get('register', 'Auth\RegisterController@showRegistrationForm');
$this->post('register', 'Auth\RegisterController@register'); // Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
$this->post('password/reset', 'Auth\ResetPasswordController@reset');
}
这里定义了 登陆 、 注销 、注册 和 密码重置 的路由。
先看看注册部分。
注册
App\Http\Controllers\Auth\RegisterController 负责注册的逻辑,这里 use 了 Illuminate\Foundation\Auth\RegistersUsers 这个 trait ,包含注册时通用的一些逻辑。
路由 get('/register') 所绑定的方法 Auth\RegisterController@showRegistrationForm 就定义在这个 trait 里:
public function showRegistrationForm()
{
return view('auth.register');
}
很简单,返回一个 auth.register 视图。
auth.register 视图获取用户的输入: name,email,password,然后 POST 提交到 ‘/register’。
再来看看路由 post('/register') 所绑定的方法 Auth\RegisterController@register。
同样, register 方法定义在 Illuminate\Foundation\Auth\RegistersUsers 里:
public function register(Request $request)
{
$this->validator($request->all())->validate(); $this->guard()->login($this->create($request->all())); return redirect($this->redirectPath());
}
首先使用请求传入的表单调用 validator() ,返回一个验证对象,再调用 validate() 验证表单内容的合法性。
validator() 定义在 App\Http\Controllers\Auth\RegisterController 里:
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|min:6|confirmed',
]);
}
在这里给出了输入表单的验证规则,如果我们的用户注册需要的表单与这几个字段不一致(例如需要添加一个手机号),就在这里修改。
返回的 Validator 对象会在 register() 方法里验证。
再回到 register() 方法, 往下走 $this->guard()->login($this->create($request->all()));。
$this->guard() 这里会调用 Illuminate\Foundation\Auth\RegistersUsers 里的 guard():
protected function guard()
{
return Auth::guard();
}
这里无参数调用 Auth::guard() 返回一个默认的 guard ,看一下 config/auth.php:
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
], 'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
], 'api' => [
'driver' => 'token',
'provider' => 'users',
],
], 'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
],
默认的 guard 是 web ; web 这个 guard 采用 session 驱动, 数据提供者是 users ;users 数据提供者使用 eloquent 驱动, 使用 App\User::class 模型。
具体这个 guard 是怎么生成的,这里暂时先不探究,放到登陆验证里再详细说明。
接下来调用 guard 的 login($this->create($request->all()))。
首先是 $this->create() ,这个方法定义在 App\Http\Controllers\Auth\RegisterController 里:
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
使用 User 模型对输入的内容新增一条记录,并返回这个模型的对象。
同样,如果需要修改注册时使用的字段,也是改写这个方法。
生成的 User 对象交给 guard 的 login() 方法,做一系列登录的操作,具体怎么做的,还是放到登陆验证里再详细说明。
最后, return redirect($this->redirectPath()); 完成了注册、登陆的操作,最后跳转到我们在 App\Http\Controllers\Auth\RegisterController 里设置的 protected $redirectTo = '/home'; 目标 URI。
可以看一下 $this->redirectPath() 方法怎么写的,在 Illuminate\Foundation\Auth\RedirectsUsers 这个 trait 里:
public function redirectPath()
{
return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home';
}
如果定义了 $redirectTo 这个属性,就按照这个属性返回;如果没有,返回 ‘/home’。
这里把这个方法写成 trait 是因为这个方法还会在
App\Http\Controllers\Auth\LoginController登陆控制器里使用,所以就把redirectPath()这个方法提出来做成一个 trait ,严格遵守 DRY 原则。
到这里,就完成了注册的所有过程。
Laravel 5.3 用户验证源码探究 (一) 路由与注册的更多相关文章
- Vue源码探究-状态初始化
Vue源码探究-状态初始化 Vue源码探究-源码文件组织 Vue源码探究-虚拟DOM的渲染 本篇代码位于vue/src/core/instance/state.js 继续随着核心类的初始化展开探索其他 ...
- Vue源码探究-全局API
Vue源码探究-全局API 本篇代码位于vue/src/core/global-api/ Vue暴露了一些全局API来强化功能开发,API的使用示例官网上都有说明,无需多言.这里主要来看一下全局API ...
- Vue源码探究-数据绑定的实现
Vue源码探究-数据绑定的实现 本篇代码位于vue/src/core/observer/ 在总结完数据绑定实现的逻辑架构一篇后,已经对Vue的数据观察系统的角色和各自的功能有了比较透彻的了解,这一篇继 ...
- Vue源码探究-虚拟DOM的渲染
Vue源码探究-虚拟DOM的渲染 在虚拟节点的实现一篇中,除了知道了 VNode 类的实现之外,还简要地整理了一下DOM渲染的路径.在这一篇中,主要来分析一下两条路径的具体实现代码. 按照创建 Vue ...
- ConcurrentHashMap源码探究 (JDK 1.8)
很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理 ...
- Mybatis日志源码探究
一.项目搭建 1.pom.xml <dependencies> <dependency> <groupId>log4j</groupId> <ar ...
- spring-cloud-sleuth+zipkin源码探究
1. spring-cloud-sleuth+zipkin源码探究 1.1. 前言 粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪, ...
- spring-boot-2.0.3之quartz集成,数据源问题,源码探究
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
- Laravel学习笔记之Session源码解析(上)
说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...
随机推荐
- appium+python 启动一个app步骤
询问度娘搭好appium和python环境,开启移动app自动化的探索(基于Android),首先来记录下如何启动待测的app吧! 如何启动APP?1.获取包名:2.获取launcherActivit ...
- 【洛谷P2722 USACO】 总分 01背包模板
P2722 总分 Score Inflation 题目背景 学生在我们USACO的竞赛中的得分越多我们越高兴. 我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助 题目描述 我们可以从几个 ...
- 阿里云合作伙伴峰会SaaS加速器专场 | 商业加持,迈进亿元俱乐部
导语:本文中,阿里云智能运营专家朱以军从宏观角度分析了SaaS市场的机遇和挑战,重点介绍了阿里云的商业操作系统.同时,阿里云SaaS加速器也在招募更多ISV合作伙伴和我们一起共创专注面向未来的应用,用 ...
- web前端学习(二)html学习笔记部分(1) -- html5新增的元素及特性等等
检查,在浏览器中可以调整设备类型 html5实现水池效果. lang:en为英文语言,中文语言zh <html lang="en"> <head> < ...
- laravel-admin 安装(总结)
https://www.jianshu.com/p/844b05e4c45a laravel-admin 是一个可以快速帮你构建后台管理的工具,它提供的页面组件和表单元素等功能,能帮助你使用很少的代码 ...
- HttpClient实现远程调用
在项目中,我们常常遇到远程调用的问题,一个模块总是无法单独存在,总需要调用第三方或者其他模块的接口.这里我们就涉及到了远程调用. 原来在 ITOO中,我们是通过使用EJB来实现远程调用的 ...
- Direct2D 第1篇 最简单的D2D程序
原文:Direct2D 第1篇 最简单的D2D程序 编译之前,得先安装DirectX SDK #include <windows.h> #include <d2d1.h> #i ...
- Leetcode905.Sort Array By Parity按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素. 你可以返回满足此条件的任何数组作为答案. 示例: 输入:[3,1,2,4] 输出:[2,4,3,1] ...
- Thrift框架应用参考
Thrift https://blog.csdn.net/aquester/article/details/48261609 https://www.cnblogs.com/liboBlog/p/60 ...
- 公司电脑安装mysql出现小问题
按步骤将mysql安装好后,在自己电脑完全没问题,但是在公司电脑安装的时候出现了这样的问题. 查阅资料以后,找到了问题: 参考链接:https://blog.csdn.net/huacode/arti ...