【问题标题】:How to have a route for both authenticated users and non-authenticated users如何为经过身份验证的用户和未经过身份验证的用户提供路由
【发布时间】:2017-09-11 09:09:39
【问题描述】:

我对 auth:api 中间件有疑问! 当我为未经身份验证的用户定义这样的路由时,我们有一个可供经过身份验证的用户和未经身份验证的用户访问的请求:

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

当访客用户请求此路线时,一切正常。 是,我可以使用$request->user();访问用户

但是如果通过不记名标头传递令牌并使用$request->user() 获取用户当然它不起作用!因为我们没有在这条路线上使用auth:api,如果我们这样做了,我们就不能用访客用户访问这条路线! 所以我找不到一种方法来为两个经过身份验证的用户定义一个路由,如果用户经过身份验证,我们会得到 $request->user() 并且没有经过身份验证的用户也可以访问该路由!

提前致谢。

【问题讨论】:

  • 您需要为此类自定义创建自己的中间件。
  • 我不明白为什么需要auth:api 才能使用户可用。 auth:api 中间件仅在不存在有效用户令牌时拒绝路由请求。它不会神奇地使令牌可用。通常你会做一个Auth::check() 来确定是否有有效的用户访问该路由。

标签: laravel oauth routes middleware laravel-passport


【解决方案1】:

我找到了一种方法,我刚刚写了这个:

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

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

【讨论】:

  • 你找到另一种更好的方法了吗?
  • 太棒了!为我工作,正在寻找这个解决方案几个小时!
【解决方案2】:

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

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

那么你不要使用任何auth 中间件。如果用户是访客,$user 将为 null,否则应设置。

【讨论】:

  • 谢谢,但我不想在每个函数中都这样做并检查用户是否存在
  • 我觉得这是最干净的方法。接受的答案会根据传入的数据修改路由中间件......看起来很hacky。
【解决方案3】:

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

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

如果你想同时显示认证用户和非认证用户的路由 您可以简单地放在中间件之外 像这样:-

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

希望你能理解

【讨论】:

  • 我猜这里是一个未理解的问题!我不想重写经过身份验证的用户和未经过身份验证的用户都可以访问的路由,例如。报告可由经过身份验证和未经过身份验证的用户创建
【解决方案4】:

我使用的解决方案是为身份验证创建一个新的中间件:

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,它将分配正确的用户来请求,否则它将作为访客进行。我确实需要做一个 $request->user() === null 来确保用户是访客

【讨论】:

    【解决方案5】:

    我想为已通过身份验证和未通过身份验证的用户使用额外的路由, 但关于这个话题,我添加了一种简单的方法:

    在控制器的__constructor 函数上添加这些行:

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

    但我不把这种方式集中在最佳实践中,这违反了单一职责原则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 2016-01-17
      • 2016-11-30
      • 2017-12-24
      • 1970-01-01
      • 2017-01-28
      • 2019-09-25
      相关资源
      最近更新 更多