Laravel学习笔记(二)- 登录授权流程分析
Contents
Laravel 内置了登录授权相关的一些东西,可以开箱即用。
接下来将会对登录授权的使用方法及流程分析进行一下介绍。
通过这篇文章,可以了解以下东西:
- 学会使用
laravel的自带登录授权功能; - 了解自带的登录授权的相关流程;
- 修改自带的
auth相关路由前缀; - 更改
auth的blade模版文件路径
注意:使用的框架版本是
5.2,跟旧版本会有一点出入,后面会提到
使用
artisan命令
首先在项目根目录执行一条artisan命令,即可自动安装一个简易的完整的用户认证系统。
注意该命令会产生一些文件,如
HomeController.php,如果你的项目已存在 相同路径相同命名 的文件,请先备份一下
具体会产生什么文件,请看下面说明
1 | php artisan make:auth |
让我们看下执行这条命令后会有什么变动:
1、会修改 ./app/Http/routes.php 路由文件,增加以下代码
1 | Route::group(['middleware' => 'web'], function () { |
2、会增加文件
1 | // 1、在 ./resources/views/ 目录生成以下`blade`模版文件 |
现在只要访问www.your-domain.com/home,就会自动判断如果没有登录,就自动跳转至登录页面www.your-domain.com/login页面了。
接下来只要再配置好数据库相关部分,就基本完成了登录注册模块的功能了。
数据库相关
Laravel数据库简单介绍可以查看这篇文章:数据库配置与使用migations生成表
数据库的配置文件位于config/database.php里。
如果使用mysql,为了以后能使用emoji表情,建议修改charset为utf8mb4,相应的collation也要修改为utf8mb4_unicode_ci
修改.env文件,添加自己的数据库连接配置(之后请确保数据库能连接上):
1 | DB_HOST= |
数据库建表文件,存放在database/migrations/目录下;框架已自带了登录授权相关的2个表文件:
1 | database/migrations/2014_10_12_000000_create_users_table.php |
如果没有特别需求(如自带的表文件是使用email登录,如果需要使用username的方式,请自行修改,这里不再详述),我们直接拿来用即可。
首先我们先自己去新建一个数据库(建议charset为utf8mb4,collation为utf8mb4_unicode_ci),注意名字要跟上面的DB_DATABASE一样;
然后在项目根目录执行以下命令即可:
1 | php artisan migrate |
建议先完整看一下官方文档,了解数据库相关操作:
数据库
Eloquent ORM
解析
auth流程分析
我们先来看看auth登录授权的相关流程:
当我们访问www.your-domain.com/home时,会有这样的流程:
1、框架在routes.php里匹配到Route::get('/home', 'HomeController@index');这条路由。
接下来进入app/Http/Controllers/HomeController.php这个文件。
2、HomeController.php的构造函数里,有中间件auth
1 | public function __construct() |
那么auth中间件将会去访问app/Http/Middleware/Authenticate.php 里的 handle 函数
3、app/Http/Middleware/Authenticate.php里handle函数有这样一句代码:
1 | redirect()->guest('login'); |
则接下来会重定向至此url: www.your-domain.com/login
4、重定向会重新去匹配路由。让我们执行一下命令,查看一下现在有什么路由:
1 | php artisan route:list |

我们发现里面有login这条路由了。
在routes.php里Route::auth()有这一句代码。查看源码:
1 | /vendor/laravel/framework/src/Illuminate/Routing/Router.php |
发现有auth()这一个函数,里面包含了login等路由:
1 | public function auth() |
所以,访问www.your-domain.com/login就会匹配到login路由。
接下来根据这条路由,我们进入Auth\AuthController去看一下,该文件路径:
(顺便记住showLoginForm这个函数名字,下面会用到)
1 | app/Http/Controllers/Auth/AuthController.php |
5、Auth\AuthController.php里我们发现没有showLoginForm这个函数,但是有这一句代码:
1 | use AuthenticatesAndRegistersUsers, ThrottlesLogins; |
让我们查看AuthenticatesAndRegistersUsers这个文件,查看源码,发现这个文件在这个路径:
1 | vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndRegistersUsers.php |
里面又有这样一句代码:
1 | use AuthenticatesUsers, RegistersUsers |
让我们再次查看AuthenticatesUsers这个文件,这个文件在这个路径:
1 | vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php |
6、AuthenticatesUsers.php这里面我们发现有showLoginForm这个函数了,源码如下:
1 | public function showLoginForm() |
这里会判断如果没有loginView这个属性,就自动跳转至auth.login这个模版文件,所以这个loginView是可以让我们来自定义登录页面路径的一个属性。
7、接下来就会访问auth.login这个模版文件,就会去找到该文件渲染页面了:
1 | resources/views/auth/login.blade.php |
以上就是整个登录授权的基本流程了。
新文件说明
接下来对刚才执行artisan命令后的变动的文件进行简单的说明
路由
新增加的一个路由配置:
1 | Route::group(['middleware' => 'web'], function () { |
Laravel自带了两个中间件web和api,其中web使用session,api使用token
1 | protected $middlewareGroups = [ |
这里统一使用了web中间件。
HomeController
我们查看app/Http/Controllers/HomeController.php文件,会发现在构造函数里有一个中间件:
1 | public function __construct() |
这个auth中间件就是判断访问该controller的页面是否需要登录验证的一个东西。
如访问www.your-domain.com/home就会自动判断如果没有登录,就自动跳转至登录页面www.your-domain.com/login
blade模版文件
注意resources/views/auth/login.blade.php代码里有用到$error这个stdClass,这个$error是在web中间件里定义的,所以如果auth路由组没有使用web中间件,就会报错了。所以要把Route::auth();这句写在路由组里。
当然,如果你完全使用的是自定义的登录注册相关blade文件,就可以忽略了,根据自己需求去写就行了。
自定义
修改auth前缀
更改auth相关路由的前缀,如www.your-domain.com/admin/login;
通过上面auth流程分析的说明,我们可以只需做以下操作即可增加前缀:
1、修改routes.php,加上prefix参数:
1 | Route::group(['prefix' => 'admin', 'middleware' => 'web'], function () { |
2、修改app/Http/Middleware/Authenticate.php,将redirect()->guest('login');改为以下代码:
1 | redirect()->guest('admin/login'); |
转移blade文件路径
有时需要将auth相关的blade模版文件转移路径。
比如说原本是在:
1 | resources/views/auth/login.blade.php |
现在要转移至
1 | resources/views/admin/auth/login.blade.php |
通过上面的流程分析,我们只需要在app/Http/Controllers/Auth/AuthController.php文件,增加属性$loginView来设置blade模版文件路径即可。
1 | // 设置登录页面的模版文件: |
网上说是修改$loginPath,经过排查,发现5.2版本后,跟以前的不一样了,以前的才是$loginPath,现在要$loginView。
可查看以下5.1及5.2的authentication官方文档,在5.1的文档里搜索loginPath会有结果,而5.2已经没了:
5.1文档 - authentication
5.2文档 - authentication
如果还需要修改登录页面的其他属性,可去查看源码:
1 | vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php |
如果需要查看注册页面的相关属性,可查看源码:
1 | vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php |
可以发现还可以自定义这些路径,只要在AuthController.php里添加以下属性即可:
1 | // 设置退出登录后的路径: |
2016.05.11 21:47
Aevit
华师
Author: Arvit
Link: https://arvit.xyz/2016/05/11/laravel-learning-2/
License: 知识共享署名-非商业性使用 4.0 国际许可协议
