简介
Laravel 5.3 的 Auth 认证在 5.2 的基础上又有一些改变,本文说明如何在 Laravel 5.3 下做不同用户表的登录认证。
Auth 认证原理简述
Laravel 的认证是使用 guard 与 provider 配合完成, guard 负责认证的业务逻辑,认证信息的服务端保存等; provider 负责提供认证信息的持久化数据提供。
请求提交给 guard, guard 从 provider 里取出数据(类似用户名、密码等),验证输入数据与服务器端存储的数据是否吻合。如果提交的数据正确,再做 session 等业务的处理(如有需要)。
认证脚手架
首先我们导入 Laravel 的自带的认证脚手架
1 | php artisan make:auth |
执行数据库迁移
1 | php artisan migrate |
修改 Auth 认证的配置文件 config/auth.php,在 gurads 处,添加 admin guard 用于后台管理员认证
1 | 'guards' => [ |
在 providers 处添加 admins provider,使用 Admin 模型
1 | 'providers' => [ |
注意:本文将所有的 Model 都存放在 App\Models\ 目录下。
创建后台管理员模型
我们再创建一个 Admin 模型,用于后台管理员登录验证
1 | php artisan make:model Admin -m |
-m 参数会同时生成数据库迁移文件 xxxx_create_admins_table
修改 app/Admin.php 模型文件
1 | <?php |
编辑 xxxx_create_admins_table 文件,后台管理员模型结构与前台用户差不多,去掉 email 字段,name 字段设为 unique(),后台用户登录使用用户名、密码的形式,如果需要 email ,也可以不去掉。
1 | <?php |
管理员模型填充数据
定义一个数据模型工厂,在 database/factories/ModelFactory.php 中添加如下代码
1 | $factory->define(App\Admin::class, function (Faker\Generator $faker) { |
使用 Faker 随机填充用户名
在 database/seeds 目录下生成 AdminsTableSeeder.php 文件
1 | php artisan make:seeder AdminsTableSeeder |
编辑 database/seeds/AdminsTableSeeder.php 文件的 run 方法,添加3个管理员用户,密码为 123456
1 | public function run() |
在 database/seeds/DatabaseSeeder.php 的 run 方法里调用 AdminsTableSeeder 类
1 | public function run() |
执行数据库迁移命令
1 | php artisan migrate --seed |
数据库里会创建 admins 表,并且生成了3条数据:
id | name | password | remember_token | created_at | updated_at |
---|---|---|---|---|---|
1 | John | $2y$10$AYD4MoW… | 9p7bycJ5Wn | 2017-05-05 15:12:37 | 2017-05-05 15:12:37 |
2 | Ransom | $2y$10$AYD4MoW… | Ct8W5nmTsg | 2017-05-05 15:12:37 | 2017-05-05 15:12:37 |
3 | Dulce | $2y$10$AYD4MoW… | I8RJpxwVrk | 2017-05-05 15:12:37 | 2017-05-05 15:12:37 |
创建后台页面
创建控制器
1 | php artisan make:controller Admin/LoginController |
其中, Admin/LoginController 负责登录逻辑; Admin/IndexController 管理登录后的首页。
编辑 Admin/LoginController.php
1 | <?php |
编辑 Admin/IndexController.php
1 | <?php |
后台显示模板
复制 views/layouts/app.blade.php 成 views/layouts/admin.blade.php。
编辑后台管理布局模板
1 | <!DOCTYPE html> |
复制 views/auth/login.blade.php 成 views/admin/login.blade.php。
编辑该模板,更改布局文件为 layouts.admin, 把表单的提交 url 改为 admin/login,email 字段改成 name 字段,去掉找回密码的部分
1 | @extends('layouts.admin') |
复制 views/home.blade.php 成 views/admins/index.blade.php。
编辑该模板
1 | @extends('layouts.admin') |
添加后台路由
编辑 routes/web.php, 添加以下内容
1 | Route::group(['prefix' => 'admin'], function () { |
后台管理认证中间件
创建后台管理认证中间件
1 | php artisan make:middleware AuthAdmin |
编辑 AuthAdmin
1 | <?php |
创建后台管理登录跳转中间件,用于有些操作在登录之后的跳转
1 | php artisan make:middleware GuestAdmin |
编辑该中间件的 handle 方法
1 | public function handle($request, Closure $next) |
在 app/Http/Kernel.php 中注册以上中间件
1 | protected $routeMiddleware = [ |
处理注销
经过上面的步骤,已经实现了前后台分离登录,但是不管是在前台注销,还是在后台注销,都销毁了所有的 session,导致前后台注销连在一起。所以我们还要对注销的方法处理一下。
原来的 logout 方法是这样写的,在 Illuminate\Foundation\Auth\AuthenticatesUsers 里
1 | public function logout(Request $request) |
注意这一句
1 | $request->session()->flush(); |
将所有的 session 全部清除,这里不分前台、后台,所以要对这里进行改造。
因为前台、后台注销都要修改,所以我们新建一个 trait,前后台都可以使用。
新建一个文件 app/Extensions/AuthenticatesLogout.php 这里需要新建 Extensions 文件夹,在Laravel5.3中是没有这个文件夹的
1 | <?php |
我们将
1 | $request->session()->flush(); |
改成
1 | $request->session()->forget($this->guard()->getName()); |
只是删除掉当前 guard 所创建的 session,这样就达到了分别注销的目的。
修改 Auth/LoginController.php 和 Admin/LoginController.php,将
1 | use AuthenticatesUsers; |
改掉,在文件的前面别忘了加上 use 语句
1 | use App\Extensions\AuthenticatesLogout; |
到这里,就完成了整个不同用户表登录认证的过程。
Read More: