认证原理
Laravel 的认证组件由 guards 和 providers 组成,guard 定义了用户在每个请求中如何实现认证,例如,Laravel 通过session guard 来维护 Session 存储的状态和 Cookie。provider 定义了如何从持久化存储中获取用户信息,laravel 底层支持通过 Eloquent 和数据库查询构建器两种方式来获取用户。
了解了它的认证原理,那么让我们开始去实现前后台登录认证吧。前台的认证使用默认的就好,这里主要讲怎么在有前台认证的情况下同时实现后台验证。
1、生成laravel自带的认证脚手架
$ php artisan make:auth
以上命令将自动生成auth模板文件夹和layouts模板文件夹以及路由信息:
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
2、修改config/auth.php配置,添加后台认证信息
2.1 在 gurads 处,添加 admin guard 用于后台管理员认证
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
2.2 在 providers 处添加 admins provider,使用 Admin 模型
'admins' => [
'driver' => 'eloquent',
'model' => App\Http\Model\Admin\Admin::class,
],
3、创建后台管理员模型
$ php artisan make:model Http/Model/Admin/Admin -m
//-m 参数会同时生成数据库迁移文件 xxx_create_admins_table
//等同于
//php artisan make:model Admin
//php artisan make:migration creaet_admins_table
4、修改数据库迁移文件xxx _create_admins_table
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
5、创建表并生成临时数据
5.1 database/factories/ModelFactory.php, 添加数据:
$factory->define(App\Http\Model\Admin\Admin::class, function (Faker\Generator $faker) {
static $password;
return [
'name' => $faker->name,
'password' => $password ?: $password = bcrypt('123456'),
'email' => $faker->email,
'remember_token' => str_random(10),
];
});
5.2 生成数据方式1---使用tinker:
$ php artisan tinker
use App;
factory(App\Http\Model\Admin\Admin::class,5)->create();//3表示生成3条测试数据
5.3 方式2---在 database/seeds 目录下生成 AdminsTableSeeder.php 文件
$ php artisan make:seeder AdminsTableSeeder
编辑该文件
public function run()
{
factory('App\Http\Model\Admin\Admin', 3)->create([//3表示生成3条测试数据
'password' => bcrypt('123456')
]);
}
在 database/seeds/DatabaseSeeder.php 的 run 方法里调用 AdminsTableSeeder 类
public function run()
{
$this->call(AdminsTableSeeder::class);
}
执行数据库迁移命令
$ php artisan migrate --seed
数据库里会创建 admins 表,并且生成了3条数据
6、修改 app/Http/Model/Admin/Admin.php 模型文件
namespace App\Http\Model\Admin;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
7、创建控制器
$ php artisan make:controller Admin/LoginController
$ php artisan make:controller Admin/AdminController
8、编辑 Admin/LoginController.php:
<?php
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Where to redirect users after login / registration.
*
* @var string
*/
protected $redirectTo = '/admin/index';
protected $username;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
//$this->middleware('guest.admin')->except('logout');//使用自定义的中间件
$this->middleware('guest:admin')->except('logout');//冒号后面的admin作为参数传给中间件的$guard形参
$this->username = config('admin.global.username');
}
/**
* 重写登录视图页面
*/
public function showLoginForm()
{
return view('admin.auth.login');
}
/**
* 自定义认证驱动
* @return mixed
*/
protected function guard()
{
return auth()->guard('admin');
}
/**
* 重写验证时使用的用户名字段
*/
public function username()
{
return 'name';//默认为使用邮箱验证,这里可以改成用户名
}
/**
* 重写退出登录
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->forget($this->guard()->getName());
$request->session()->regenerate();
return redirect('/admin');
}
}
9、修改 app\Http\Middleware\RedirectIfAuthenticated.php
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
// 根据不同 guard 跳转到不同的页面
$url = $guard ? 'admin/index':'/home';
return redirect($url);
}
return $next($request);
}
10、编辑 Admin\AdminController.php:(作为后台基类)
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth.admin:admin');
}
//
public function index()
{
//dd('用户名:'.auth('admin')->user()->name);
return view('admin.index');
}
11、创建中间件
11.1 创建后台管理认证中间件
$ php artisan make:middleware AuthAdmin
use Closure;
use Illuminate\Support\Facades\Auth;
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('admin/login');
}
}
return $next($request);
}
11.2 创建后台管理登录跳转中间件,用于登录之后再访问登录路由时的跳转
11.2.1 如果LoginController中使用的中间件是'guest:admin',也就是RedirectIfAuthenticated,那么只要修改RedirectIfAuthenticated中间件即可
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
//return redirect('/home');
// 根据不同 guard 跳转到不同的页面
$url = $guard ? 'admin/index':'/home';
return redirect($url);
}
return $next($request);
}
11.2.2 如果LoginController中使用的中间件是'guest.admin',那么创建后台管理登录跳转中间件,并注册为guest.admin
$ php artisan make:middleware GuestAdmin
public function handle($request, Closure $next)
{
if (auth()->guard('admin')->check()) {
return redirect('/admin');
}
return $next($request);
}
12、在 app\Http\Kernel.php 中注册中间件:
protected $routeMiddleware = [
******
'auth.admin' => \App\Http\Middleware\AuthAdmin::class,
'guest.admin' => \App\Http\Middleware\GuestAdmin::class,
];
13、注册路由-- routes/web.php
//后台模块
Route::group(['prefix' => 'admin','namespace' => 'Admin', 'middleware'=>'web'],function ($router){
$router->get('login', 'LoginController@showLoginForm')->name('admin.login');
$router->post('login', 'LoginController@login');
$router->post('logout', 'LoginController@logout')->name('admin.logout');
$router->get('/', 'AdminController@index');
$router->get('index', 'AdminController@index');
});
15、视图文件创建和修改
复制 views/layouts/app.blade.php 到 views/layouts/admin.blade.php
复制 views/home.blade.php 到 views/admin/index.blade.php
复制 views/auth/login.blade.php, 到 views/admin/auth/login.blade.php
修改表单提交地址
{{ url('/login') }} 改成 {{ route('admin.login') }}
修改继承的模板
@extends('layouts.app') 改成 @extends('layouts.admin')
————————————————
版权声明:本文为CSDN博主「RoberHuang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/RoberHuang/article/details/78370300