0

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。

4

2 回答 2

2

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

配置/auth.php

'guards' => [
    //..

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

    //...
],

应用程序/Http/Controllers/HomeController.php

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

路线/web.php

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

测试/功能/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中间件的实现有什么问题。

于 2020-02-15T14:35:26.370 回答
2

您应该创建一个传递用户数据等的控制器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();
于 2020-02-16T07:35:32.930 回答