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

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较多的话,建议单独封装方法进行判断。

如果有不优雅的地方,请指正!谢谢~~~

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 13
Summer

早哈

3周前
sureyee

@Summer 站长早:sunglasses:

3周前
Donald2334

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

2周前
sureyee

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

2周前
Donald2334

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

2周前
sureyee

@Donald2334

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

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

2周前
Donald2334

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

file
现在这个是admin登陆状态

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

file

2周前
sureyee

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

2周前
Donald2334

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

2周前
Bowens

6翻了

2周前

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

1周前
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');

});
路由我是这样写的

3天前

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

3天前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!