【问题标题】:Laravel get user id in unprotected routeLaravel 在不受保护的路由中获取用户 ID
【发布时间】:2020-05-30 22:20:18
【问题描述】:

我正在使用Laravel guard 来保护路由,现在我想在不受保护的(普通)路由中获取用户id,例如:

受保护:

/个人资料

不受保护:

/搜索

我能够在受保护的路由中获取用户 ID,例如 ProfileController.php,如下所示:

$id = auth()->guard('agent')->user()->id;

但我想在 searchController.php 中得到它,但它返回 null,知道吗?

api.php:

Route::middleware('auth:agent')->group(function () {
    Route::get('profile', 'ProfileController@details');
});

Route::post('search', 'searchController@search');

另一方面,当用户登录并打开搜索页面时,我想获取用户 ID。

【问题讨论】:

  • cookie 中存储id 可以是option
  • 我可能听起来很傻,但是当您访问 /search 路由时 - 您当时是否通过 agent 守卫进行了身份验证?
  • @SebastianSulinski no, search 不使用警卫
  • 我明白这一点,但是当您尝试访问 /search 时 - 您当时是否已登录?如果您没有登录,那么显然将没有用户,因为没有经过身份验证。
  • 没问题 - 请检查答案 - 一切正常。您是使用默认的App\Http\Middleware\Authenticate::class 中间件还是以任何方式对其进行了修改?如果是默认值,则很可能是守卫的实现。

标签: php laravel laravel-guard


【解决方案1】:

您应该创建一个控制器来传递用户数据,例如 id 或等:

Route::middleware('auth:agent')->group(function () {
    Route::get('userdata', 'ProfileController@userdata'); // return user id
});

还有:

public function userdata(){
   ...
   $id = auth()->guard('agent')->user()->id; // just id
   return $id;
}

这个控制器可以获取所有用户数据,现在你需要在你的搜索控制器中调用这个请求:

app('App\Http\Controllers\ProfileController')->userdata();

【讨论】:

  • 嗯..让我试试这个。只是一个问题,也可以把这个放在前面吗?搜索页面的前面
  • 你到底想对用户id做什么?
  • 如果用户登录我只需要,将它的用户 ID 传递到搜索结果中以查看按钮
  • 那么为什么要在搜索请求中执行此操作,如果您使用令牌,只需传递令牌以获取用户详细信息,例如 id 等,然后在任何地方检查它,例如搜索页面并显示您的目标按钮
【解决方案2】:

所以从我上面的 cmets 继续 - 这是我尝试过并且没有任何故障的工作:

config/auth.php

'guards' => [
    //..

    'agent' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    //...
],

app/Http/Controllers/HomeController.php

public function index(): JsonResponse
{
    return new JsonResponse([
        'user' => auth()->guard('agent')->user(),
    ]);
}

routes/web.php

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

tests/Feature/HomeTest.php

/**
 * @test
 */
public function returns_user()
{
    $this->actingAs($user = factory(User::class)->create(), 'agent');

    $this->assertTrue($user->exists);
    $this->assertAuthenticatedAs($user, 'agent');

    $response = $this->get(route('home'));

    $response->assertExactJson([
        'user_id' => $user->toArray()
    ]);
}

/**
 * @test
 */
public function does_not_return_user_for_non_agent_guard()
{
    $this->actingAs($user = factory(User::class)->create(), 'web');

    $this->assertTrue($user->exists);
    $this->assertAuthenticatedAs($user, 'web');

    $response = $this->get(route('home'));

    $response->assertExactJson([
        'user_id' => null
    ]);
}

并且测试顺利通过,所以我只能猜测您的 agent 防护或 auth:agent 中间件的实现存在问题。

【讨论】:

  • 所以我检查了我的项目一步​​一步 |有一个很大的不同,我的'driver'token 不是会话。我不认为这是问题的原因,对吧?
  • 我注意到另一件事,我使用api 而不是web
  • 您是否也将令牌传递给搜索路线?
  • 否,登录控制器中 sha256 生成的令牌
  • 如果您不传递令牌,则无法验证用户身份,因此请求中将没有用户可用。
猜你喜欢
  • 2022-11-16
  • 2017-11-22
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多