【问题标题】:How to chose guard for session driver如何为会话驱动程序选择警卫
【发布时间】:2020-11-23 04:34:44
【问题描述】:

我正在尝试使用 laravel 网络路由创建登录页面。当用户登录时,会话记录将被保存到数据库中。但在会话表中,user_id 总是得到null 值。 我发现在Illuminate\Session\DatabaseSessionHandler 中,函数userId() 总是返回null。这是因为我为api 设置了默认guard。这是我的config/auth.php

    'defaults' => [
        'guard' => 'api',
        'passwords' => 'users',
    ],

当我将默认保护更改为web 时,数据库中的列user_id 的值为授权用户ID。我不想将我的默认守卫更改为web

如何为会话设置保护驱动程序?有没有Auth之类的,我们可以用Auth::guard('web')

谢谢

【问题讨论】:

  • 'api' 通常用于无状态 api,这就是为什么该守卫默认不使用会话的原因......为什么你不想使用“网络”守卫(考虑到你想要会话) ?
  • 我网站的另一部分默认使用api,所以我不想更改这些部分。
  • 如果您已经在使用名为 'api' 的防护装置,该防护装置已按照您的需要进行配置,那么您就不想进入并更改该防护装置……听起来您需要使用 2不同的守卫,所以你需要使用另一个守卫,你只需要明确地使用它,Auth::guard('web')->....(如果它不是默认值,你必须像那样访问它,但你可以在运行时调整默认值)
  • 我已经使用Auth::guard('web')->attempt($credentials) 进行登录,它运行良好,但在会话表中,user_id 始终为空。

标签: laravel session guard


【解决方案1】:

通常,API 与保持请求之间的会话状态无关。

您始终可以将具有单独警卫的其他组添加到相同的路线,并根据您的需要使用它们。例如

Route::group(['middleware' => 'auth:api'], function () {
    Route::post('/user', 'UserController@apiUser');
}

Route::group(['middleware' => 'auth'], function () {
    Route::post('/user', 'UserController@index');
}

然后单独参考

$user = auth('web')->user();

$user = auth('api')->user();

阅读here 了解使用 Passport 的 Laravel API 实现。您可能还需要考虑 Laravel Sanctum,它为您的用户提供 API 令牌生成支持。

【讨论】:

  • 我已经使用Auth::guard('web')->attempt($credentials) 进行登录,它运行良好,但在会话表中,user_id 始终为空
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2015-08-18
  • 2013-08-16
  • 1970-01-01
  • 2017-06-02
  • 2020-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多