Laravel 获取未受保护路由中的用户id

Laravel get user id in unprotected route

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

受保护:

/Profile

未受保护:

/Search

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

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

但我想在 searchController.php 中获取它,但它 return 无效,知道吗?

api.php:

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

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

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

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

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 中间件的实现有问题。

您应该创建一个控制器来传递用户数据,例如 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();