在网站的登录验证逻辑中,为了好维护,一般后台会独立出来一个模块, 此时就不能和前台的模块混到一起去验证, 需要单独为后台指定一个guard(提供数据的)
auth
laravel 的Auth是由两个部分组成的
后台登录 指定guard 不用默认的 users 表
准备
生成admin模型 同时 迁移 admin 表
php artisan make:model Admin -m
填充数据
修改 database/factories/ModelFactory.php
$factory->define(App\Admin::class, function (Faker\Generator $faker) {
static $password;
return [
'account' => $faker->unique()->safeEmail,
'nickname' => $faker->name,
'password' => $password ?: $password = bcrypt('123456')
];
});
生成填充数据文件
php make:seed AdminTableSeeder
修改填充数据文件
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
factory(\App\Admin::class)->times(10)->create();
}
}
执行填充
php artisan db:seed --class=AdminTableSeeder
一切准备好之后, 就开始写代码..
1. 添加路由
Route::group(['prefix' => '/admin', 'namespace' => 'Admin'], function () {
Route::get('/login', 'AuthController@index');
Route::post('/login', 'AuthController@login');
Route::group(['middleware' => 'admin'], function () {
// 需要通过 admin 中间件才能访问的路由
Route::get('/', 'IndexController@index');
Route::get('/user', 'AuthController@user');
});
});
2. 修改 /App/Admin 模型
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as AdminAuth;
class Admin extends AdminAuth
{
protected $fillable = [
'name', 'password', 'avatar', 'nickname'
];
protected $hidden = [
'password'
];
}
3. AuthController
namespace App\Http\Controllers\Admin;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
/**
* Class AuthController
* @package App\Http\Controllers\Admin
*/
class AuthController extends Controller
{
public function index()
{
return view('admin.login'); // 登录视图
}
/**
* @param Request $request
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function login(Request $request)
{
$account = $request->input('account');
$password = $request->input('password');
if (\auth('admin')->attempt(['account' => $account, 'password' => $password])) {
return redirect('/admin');
}
return back();
}
/**
* @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
*/
public function logout()
{
\auth('admin')->logout();
return redirect('/admin/login');
}
/**
* get current usre info
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function user()
{
return \auth('admin')->user();
}
}
4. 修改 /config/auth.php
添加一个 admin guard
为 admin 这个 guard 指定 provider
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
// 添加 admin guard
'admin' => [
'driver' => 'session',
'provider' => 'admin'
],
'api' => [
'driver' => 'token',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
// 添加admin provider, 简单理解,就是指定提供数据的模型
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
5. 注册中间件
生成中间件
php artisan make:middleware AdminAuth
在中间件中验证
namespace App\Http\Middleware;
use Closure;
class AdminAuth
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!\auth('admin')->check()) {
return redirect('/admin/login');
}
return $next($request);
}
}
测试
....这个就自己测试
注意事项
建议使用 \auth('admin') 这种助手函数的形式 Auth::guard('admin') 这个Auth是需要use的, 用助手函数就不用 use 了
在使用 auth 的时候一定注意要指定 guard, 如果不指定laravel 默认使用的是的是 web 这个guard
一图胜千言
最后
自己动手敲 1次比看别人文章100次理解更深刻
纸上得来终觉浅,绝知此事要躬行