Laravel在不受保护的路由中获取用户ID

时间:2020-02-15 10:20:18

标签: php laravel laravel-guard

我正在使用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。

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:1)

因此,从我上面的评论继续进行-这是我尝试且无故障的工作方式:

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中间件的实现与否。