如何为经过身份验证的用户和 non-authenticated 用户提供路由
How to have a route for both authenticated users and non-authenticated users
我对 auth:api 中间件有疑问!
当我为 non-authenticated 用户定义这样的路由时,我们有一个经过身份验证的用户和 non-authenticated 用户都可以访问的请求:
Route::post('{user}/leads', 'UsersController@getContact');
来宾用户请求此路由时一切正常。
是,我可以使用 $request->user();
访问用户
但是如果使用 bearer header 传递令牌并使用 $request->user()
获取用户当然是行不通的!因为我们没有在这条路线上使用 auth:api
,如果我们这样做了,我们就不能用访客用户访问这条路线!
所以我找不到一种方法来为两个经过身份验证的用户定义一条路由,如果用户经过身份验证,我们会得到 $request->user()
和 none 经过身份验证的用户也可以访问该路由!
提前致谢。
如果您希望路由仅对经过身份验证的用户可见,您可以将所有路由放入默认由 laravel 提供的 auth 中间件中,您可以这样放置:-
enter code here
Route::group(['middleware' => ['auth']], function () {
Route::post('{user}/leads', 'UsersController@getContact');
});
并且如果你想显示认证用户和非认证用户的路由
你可以简单地放在中间件外面
喜欢那个:-
Route::match(['get', 'post'], '/cms-page','CmsController@cms');
希望你明白
这是因为 Auth
使用默认的 web
守卫。您必须手动检查 api
守卫:
$user = Auth::user() ?? Auth::guard("api")->user();
那么你不使用任何 auth
中间件。如果用户是访客,$user
将是 null
,否则应设置。
我找到了一种方法,我刚刚写了这个:
$middleware = ['api'];
if (\Request::header('Authorization'))
$middleware = array_merge(['auth:api']);
Route::group(['prefix' => 'v1', 'namespace' => 'Api', 'middleware' => $middleware], function () {
//routes here
});
在 api.php 路由文件中,它工作正常。
谢谢
我使用的解决方案是为 auth 创建一个新的中间件:
public function handle($request, Closure $next, ...$guards)
{
try
{
$this->authenticate($request, $guards);
}
catch(AuthenticationException $ex)
{
}
return $next($request);
}
在我的路线底部我做了:
Route::middleware('auth_optional:api')->group(function () {
Route::get('services', [ServiceController::class,'index']);
});
这样,如果需要身份验证,它将分配正确的用户来请求,否则它将以访客身份继续。我确实需要做一个 $request->user() === null 来确保用户是 guest
我想使用经过身份验证的用户和 non-authenticated 用户的其他路由,
但是关于这个主题,我添加了一种简单的方法:
在控制器的 __constructor
函数中添加这些行:
$authorizationHeader = \request()->header('Authorization');
if(isset($authorizationHeader)) {
$this->middleware('auth:api');
}
但我并没有将这种方式作为最佳实践,这违反了单一职责原则。
我对 auth:api 中间件有疑问! 当我为 non-authenticated 用户定义这样的路由时,我们有一个经过身份验证的用户和 non-authenticated 用户都可以访问的请求:
Route::post('{user}/leads', 'UsersController@getContact');
来宾用户请求此路由时一切正常。
是,我可以使用 $request->user();
但是如果使用 bearer header 传递令牌并使用 $request->user()
获取用户当然是行不通的!因为我们没有在这条路线上使用 auth:api
,如果我们这样做了,我们就不能用访客用户访问这条路线!
所以我找不到一种方法来为两个经过身份验证的用户定义一条路由,如果用户经过身份验证,我们会得到 $request->user()
和 none 经过身份验证的用户也可以访问该路由!
提前致谢。
如果您希望路由仅对经过身份验证的用户可见,您可以将所有路由放入默认由 laravel 提供的 auth 中间件中,您可以这样放置:-
enter code here
Route::group(['middleware' => ['auth']], function () {
Route::post('{user}/leads', 'UsersController@getContact');
});
并且如果你想显示认证用户和非认证用户的路由 你可以简单地放在中间件外面 喜欢那个:-
Route::match(['get', 'post'], '/cms-page','CmsController@cms');
希望你明白
这是因为 Auth
使用默认的 web
守卫。您必须手动检查 api
守卫:
$user = Auth::user() ?? Auth::guard("api")->user();
那么你不使用任何 auth
中间件。如果用户是访客,$user
将是 null
,否则应设置。
我找到了一种方法,我刚刚写了这个:
$middleware = ['api'];
if (\Request::header('Authorization'))
$middleware = array_merge(['auth:api']);
Route::group(['prefix' => 'v1', 'namespace' => 'Api', 'middleware' => $middleware], function () {
//routes here
});
在 api.php 路由文件中,它工作正常。 谢谢
我使用的解决方案是为 auth 创建一个新的中间件:
public function handle($request, Closure $next, ...$guards)
{
try
{
$this->authenticate($request, $guards);
}
catch(AuthenticationException $ex)
{
}
return $next($request);
}
在我的路线底部我做了:
Route::middleware('auth_optional:api')->group(function () {
Route::get('services', [ServiceController::class,'index']);
});
这样,如果需要身份验证,它将分配正确的用户来请求,否则它将以访客身份继续。我确实需要做一个 $request->user() === null 来确保用户是 guest
我想使用经过身份验证的用户和 non-authenticated 用户的其他路由, 但是关于这个主题,我添加了一种简单的方法:
在控制器的 __constructor
函数中添加这些行:
$authorizationHeader = \request()->header('Authorization');
if(isset($authorizationHeader)) {
$this->middleware('auth:api');
}
但我并没有将这种方式作为最佳实践,这违反了单一职责原则。