Laravel 多 Guard 下,如何处理未登录时都跳转同一个登录界面的问题。
laravel有开箱即用的Auth
认证系统,用起来很方便,但是有时候也会碰到一些坑,比如:你在定义了多个guard
的情况下,有一个admin.login
和login
两个登录界面,分别用于管理员和用户的登录,但是你会发现,你在没有登录的时候进入管理员中心,也会跳转到login
页面,这样就很蛋疼了。
/**
* Convert an authentication exception into a response.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Auth\AuthenticationException $exception
* @return \Illuminate\Http\Response
*/
protected function unauthenticated($request, AuthenticationException $exception)
{
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(route('login'));
}
这是因为laravel
在跳转的时候,使用的是login
。那么如何进行调整呢?
我们可以在App\Exceptions\Handler
中重写该方法,来实现自定义跳转。
protected function unauthenticated($request, AuthenticationException $exception)
{
$guards = $exception->guards();
return $request->expectsJson()
? response()->json(['message' => $exception->getMessage()], 401)
: redirect()->guest(
in_array('admin', $guards) ? route('admin.login') : route('login')
);
}
通过AuthenticationException
获取guard
,这里返回的是个数组,不清楚是不是会出现多个guard
的情况,待发现,获取到guard
之后,判断一下就可以分发路由了,如果定义的guard
较多的话,建议单独封装方法进行判断。
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
早哈
@Summer 站长早:sunglasses:
我的情况和你的一样 我还有个问题 登陆后,普通用户点页面和其他页面 进去都正常 还是登陆状态, 但admin的页面登陆后是正常的登录状态, 但点进其他页面就好像跳出登陆状态, 要再点login才进去登陆状态
@Donald2334 会不会是其他页面的guard没有改造成的?
@sureyee 能告诉我如何操作吗?
@Donald2334
路由中间件需要指定guard,
auth:admin
你这个写了没有的,不然就用的default
的配置@sureyee 能告诉我如何操作吗?
@sureyee
现在这个是admin登陆状态
当我点create course navbar 就好像logout的状态
@Donald2334
你现在是前后台都有登录认证吗?还有认证是否是通过laravel的Auth进行的,如果不是的话,就不能用
Auth::user()
获取信息,如果是多guard
获取认证信息的时候也要使用Auth::guard('admin')->user()
,这个admin
对应你的guard
名称@sureyee 不懂 如何前后台认证

是在哪里加东西?
6翻了
@Donald2334 你的Admin登陆后访问的路由没有加上admin guard 吧,这样是拿不到用户数据的
还有Auth::user() 直接就能拿到Admin信息,前提是你这个路由里面只有一个 guard
@Jinrenjie
Route::prefix('admin')->group(function() {
Route::get('/login', 'Auth\AdminLoginController@showLoginForm')->name('admin.login');
Route::post('/login', 'Auth\AdminLoginController@login')->name('admin.login.submit');
Route::get('/', 'AdminController@index')->name('admin.dashboard');
Route::get('/logout','Auth\AdminLoginController@logout')->name('admin.logout');
Route::get('/register','Auth\AdminRegisterController@showRegistrationForm')->name('admin.register');
Route::post('/register','Auth\AdminRegisterController@register')->name('admin.register.submit');
});
路由我是这样写的
@Donald2334 执行php artisan route:list 看一下create course navbar 按钮跳转的页面 是否有guard,如果没有的话,访问时拿不到登陆信息的,加上对应的guard 就可以了
哇 多谢!!!!
修改中间件

App\Http\Middleware\Authenticate
嗯,干的漂亮!