1

我想在我的应用程序中为两种类型的用户实现本机多重身份验证:UserAdmin

  1. 我开始实施新的admins表迁移(通过复制现有的 create_users_table)。

  2. 我创建了一个名为Admin的新模型(通过复制现有的User模型)

  3. 两个(UserAdmin)模型都进行了更新,以指定他们使用的守卫,如下所示:

用户模型

protected $guarded  = ['user'];

管理模型

protected $guarded  = ['admin'];
  1. 然后我像这样设置身份验证配置:

配置/auth.php

https://pastebin.com/iLAZbX2z

  1. 然后我定义了我的自定义身份验证路由usersadmins如下所示:

路线/web.php

https://pastebin.com/raw/CKX9Xddb

  1. 最后,我为这两种用户类型定义了身份验证保护路由,如下所示:

路线/web.php

// User auth protected pages
Route::prefix('manage')->middleware('auth:user')->namespace('Manage')->group(function() {

    Route::get('/', 'DashboardController@index');

});

// Admin auth protected pages
Route::prefix('admin')->middleware('auth:admin')->namespace('Admin')->group(function() {

    Route::get('/', 'DashboardController@index');

});

我在继续之前先测试了用户登录(要让管理员登录还有更多工作要做),通过进入http://myapp.local/login并输入我的凭据,我被成功重定向到用户的仪表板(即http:/ /myapp.local/manage)。所有用户特定的功能(例如重置通行证)等都可以正常工作)。

然而; 通过直接访问来测试来宾中间件时http://myapp.local/manage,我预计会被重定向到http://myapp.local/login但得到一个错误:

路线 [登录] 未定义。

这个错误是有效的;因为在路由定义中,我将用户登录名命名为user.login

看起来中间件使用了在未经身份验证的异常处理程序中guest调用的硬编码命名路由。login

供应商\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php

protected function unauthenticated($request, AuthenticationException $exception)
{
    return $request->expectsJson()
                ? response()->json(['message' => $exception->getMessage()], 401)
                : redirect()->guest(route('login')); // <------
} 

如何告诉来宾中间件使用不同名称的登录路由(当未经身份验证的用户尝试访问受身份验证保护的页面时)?

稍后我还需要将它用于管理访客中间件。

4

3 回答 3

1

感谢Sohel0415的回答;我意识到App\Exceptions\Handler扩展了vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php,这意味着我可以像这样解决它:

我已经编辑了app\Exceptions\Handler.php这样的:

  1. use在顶部包含此声明:

使用 Illuminate\Auth\AuthenticationException;

  1. 添加了这个方法:

https://pastebin.com/raw/10Y1tS6d

于 2018-02-11T11:52:25.313 回答
0

使用Request::is()check然后requested url重定向:

protected function unauthenticated($request, AuthenticationException $exception)
{
      if(\Request::is('manage/*')){
      return $request->expectsJson()
            ? response()->json(['message' => $exception->getMessage()], 401)
            : redirect()->guest(route('user.login'));
      }
      else if(\Request::is('admin/*')){
        return $request->expectsJson()
            ? response()->json(['message' => $exception->getMessage()], 401)
            : redirect()->guest(route('admin.login'));
      }
      else{
        return $request->expectsJson()
            ? response()->json(['message' => $exception->getMessage()], 401)
            : redirect()->guest(route('login'));
      }
}

注意:将此方法添加到App\Exceptions\Handler

于 2018-02-11T11:24:21.023 回答
0

我已将用户登录名命名为user.login

您收到错误是因为路由名称是user.login并且您正在尝试使用login路由。因此,请在此处使用正确的路线名称:

redirect()->guest(route('user.login')); 
于 2018-02-11T11:16:20.253 回答