Laravel 多 Guard 下,如何处理未登录时都跳转同一个登录界面的问题。

laravel有开箱即用的Auth认证系统,用起来很方便,但是有时候也会碰到一些坑,比如:你在定义了多个guard的情况下,有一个admin.loginlogin两个登录界面,分别用于管理员和用户的登录,但是你会发现,你在没有登录的时候进入管理员中心,也会跳转到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 协议》,转载必须注明作者和本文链接
打酱油
本帖由系统于 1年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 15
Summer

早哈

5年前 评论

@Summer 站长早:sunglasses:

5年前 评论
Donald2334

我的情况和你的一样 我还有个问题 登陆后,普通用户点页面和其他页面 进去都正常 还是登陆状态, 但admin的页面登陆后是正常的登录状态, 但点进其他页面就好像跳出登陆状态, 要再点login才进去登陆状态

5年前 评论

@Donald2334 会不会是其他页面的guard没有改造成的?

5年前 评论
Donald2334

@sureyee 能告诉我如何操作吗?

5年前 评论

@Donald2334

Route::group(['middleware' => 'auth:admin'], function () {
    Route::get('/dashboard', 'IndexController@dashboard')->name('dashboard');
});

路由中间件需要指定guard,auth:admin 你这个写了没有的,不然就用的default的配置

5年前 评论
Donald2334

@sureyee 能告诉我如何操作吗?
@sureyee

file
现在这个是admin登陆状态

file
当我点create course navbar 就好像logout的状态

file

5年前 评论

@Donald2334
你现在是前后台都有登录认证吗?还有认证是否是通过laravel的Auth进行的,如果不是的话,就不能用Auth::user()获取信息,如果是多guard获取认证信息的时候也要使用Auth::guard('admin')->user(),这个admin对应你的guard名称

5年前 评论
Donald2334

@sureyee 不懂 如何前后台认证
是在哪里加东西?
file

5年前 评论

@Donald2334 你的Admin登陆后访问的路由没有加上admin guard 吧,这样是拿不到用户数据的
还有Auth::user() 直接就能拿到Admin信息,前提是你这个路由里面只有一个 guard

5年前 评论
Donald2334

@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');

});
路由我是这样写的

5年前 评论

@Donald2334 执行php artisan route:list 看一下create course navbar 按钮跳转的页面 是否有guard,如果没有的话,访问时拿不到登陆信息的,加上对应的guard 就可以了

5年前 评论

哇 多谢!!!!

4年前 评论

修改中间件App\Http\Middleware\Authenticate
file

嗯,干的漂亮!

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!