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();
我正在使用 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();