Laravel 5.5 中忽略了非默认守卫

Posted

技术标签:

【中文标题】Laravel 5.5 中忽略了非默认守卫【英文标题】:Non default guard is being ignored in Laravel 5.5 【发布时间】:2018-03-30 17:14:43 【问题描述】:

我正在为 REST Api 设置一个 Laravel 项目。 基本上,我将用户放入两个表中,用户和管理员(型号名称)。 我想使用 Default Laravel 的 Authentication Scaffold 通过 web Guard 对管理员进行身份验证,并使用 JWT(tymondesigns 提供的包)通过 api Guard 对用户进行身份验证。 一切顺利。我配置了包,在 app/auth.php 中设置了守卫和提供程序,几乎可以正常工作了。

我现在可以通过 Auth Scaffold 注册管理员,并通过用户的自定义登录控制器登录用户。我在浏览器上测试了管理员登录,它工作正常。然后在为用户设置登录之前,我将 app/auth.php 中的默认保护更改为 api(原为:web),认为这是有道理的,因为大多数请求将作为 API 完成。我继续构建自定义登录控制器并测试了自定义登录。路由保存在不同的文件中,API 路由在 routes/api.php 和管理路由 routes/web.php。我再次在浏览器上测试管理员登录,它不再工作了。尝试再次将默认防护更改为 web 并且它正在工作。不知何故,为每个路由定义的保护被忽略,只使用默认保护。 我在网上阅读了很多内容,但我尝试的每件事都没有奏效。

这是文件:

配置/auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],
'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'password_resets',
        'expire' => 60,
    ]
],

路由/web.php

Route::get('/', function () 
return view('welcome');
);

Auth::routes();

Route::get('home', 'HomeController@index')->name('home');

路由/api.php

Route::middleware('guest')->post('login', 'UserAuth\LoginController@login')->name('user.login');

Route::middleware('auth')->get('user', 'BaseController@loggedUserAPI')
->name('user.user');

感谢任何形式的帮助或建议。

【问题讨论】:

【参考方案1】:

正如你所说,你使用的是 Laravel 提供的默认 Authentication Scaffold,你必须覆盖 Http/Controllers/Auth/LoginController 中的 guard() 方法,否则将始终使用默认保护。

/**
 * Get the guard to be used during authentication.
 *
 * @return \Illuminate\Contracts\Auth\StatefulGuard
 */
protected function guard()

    // specify the guard that should be used for login attempts
    return Auth::guard('web');

您还应该修改 LoginController 的构造函数以使用正确的中间件:

public function __construct()

    $this->middleware('guest:web')->except('logout');

在你的 routes/web.php 文件中,你必须告诉你的 auth 和 guest 中间件使用正确的保护(如果它不是默认的)

// 例如:

Route::middleware('auth:web')->get('admin', 'AdminController@dashboard')
->name('user.user');

【讨论】:

非常感谢.. 我没有考虑将路由包装在 web 路由文件中。再次谢谢你 ! :) 这个问题困扰了我好几天。很难找到关于这个特定问题的任何信息,感谢您的帮助!

以上是关于Laravel 5.5 中忽略了非默认守卫的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 中使用多个守卫时,在注册/登录后设置默认守卫

Laravel 5.5 - 升级身份验证后没有正确重定向

Laravel Dusk 忽略 .env.dusk 和 .env.dusk.local(使用 Valet 和 Laravel 5.5)

Laravel 7 将默认守卫更改为员工,但当前经过身份验证的用户返回 null

如何在 laravel 项目中同时使用 web 的守卫和 api 的守卫?

为啥laravel中的两个守卫会相互影响?