laravel 如何为经过身份验证的用户和未经身份验证的用户创建路由

kqlmhetl  于 2022-11-18  发布在  其他
关注(0)|答案(6)|浏览(221)

我遇到了一个auth:api中间件的问题!当我为非认证用户定义了一个如下的路由时,我们有一个请求,认证用户和非认证用户都可以访问:

Route::post('{user}/leads', 'UsersController@getContact');

当客人用户请求此路由时,一切正常。是,我可以使用$request->user();访问用户
但如果通过带有bearer头的令牌并获得带有$request->user()的用户,则当然不起作用!因为我们没有在此路由上使用auth:api,如果我们使用了auth:api,则无法通过访客用户访问此路由!因此,我无法找到为两个已验证用户定义一个路由的方法,即如果用户已验证,则获得$request->user(),而任何已验证用户也无法访问此路由!
先谢谢你。

o8x7eapl

o8x7eapl1#

我找到了一个方法我只是写了这个:

$middleware = ['api'];
if (\Request::header('Authorization')) 
   $middleware = array_merge(['auth:api']);
Route::group(['prefix' => 'v1', 'namespace' => 'Api', 'middleware' => $middleware], function () {
    //routes here
});

在api.php路径文件中,它工作正常。谢谢

cczfrluj

cczfrluj2#

这是因为Auth使用默认的web保护。您必须手动检查api保护:

$user = Auth::user() ?? Auth::guard("api")->user();

如果用户是guest,则不使用任何auth中间件。$user将为null,否则应设置。

nwlls2ji

nwlls2ji3#

我使用的解决方案是为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']);
});

这样,如果需要Auth,它将为请求分配正确的用户,否则它将以guest身份继续。

a11xaf1n

a11xaf1n4#

如果您希望路由只对认证用户可见,您可以将所有路由放在laravel默认提供的认证中间件中,您可以这样放置:-

enter code here
Route::group(['middleware' => ['auth']], function () {
Route::post('{user}/leads', 'UsersController@getContact');
});

如果你想显示路由验证和非验证用户,你可以简单地把中间件外部像:-

Route::match(['get', 'post'], '/cms-page','CmsController@cms');

希望你能理解

yzxexxkh

yzxexxkh5#

我想使用额外的路由验证和非验证用户,但关于主题我添加一个简单的方法:
在Controller的__constructor函数上添加以下行:

$authorizationHeader = \request()->header('Authorization');
        if(isset($authorizationHeader)) {
            $this->middleware('auth:api');
        }

但我并不把这种方式作为最佳实践,这违反了单一责任原则。

tpgth1q7

tpgth1q76#

如果您使用的是Laravel Passport,那么这种方式可以更干净。
在控制器中,您可以通过

$user = $request->user('api');

这将为您获取经过身份验证的用户,如果不记名令牌无效,则不会抛出“未验证”错误,而是导致空用户。
参考:How to authenticate user without auth:api middleware in laravel 5.3?

相关问题