【问题标题】:laravel passport: Request user() returning null outside auth:api middleware, and inside returning user objectlaravel 护照:请求 user() 在 auth:api 中间件之外返回 null,在返回用户对象内部
【发布时间】:2017-09-08 06:56:20
【问题描述】:

当我尝试使用 auth:api 中间件获取登录用户详细信息时,它会在我的控制器函数中返回包含详细信息的用户对象。

api.php (with auth:api middleware returns User object)

Route::group(['middleware' => 'auth:api'], function() {
    Route::get('users/mentor_details/{uuid}','UserController@getMentorProfileDetails');
});

但是当我试图在 auth:api 中间件之外获取登录用户详细信息时,它返回 null。

api.php (without auth:api middleware return null)

Route::get('users/mentor_details/{uuid}','UserController@getMentorProfileDetails');

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    当没有提供auth中间件,或者提供了没有指定守卫时,使用默认守卫来判断用户。除非您在 config/auth.php 文件中更改了此项,否则默认保护是 web 保护。

    因此,当您转到不受特定身份验证中间件保护的路由时,加载的用户是 web 保护提供的用户。

    因此,即使您可能发送不记名令牌以使用特定用户,web 守卫对此一无所知,并且由于您没有用户通过web 守卫登录,因此您是获取null 用户。

    您有四个选择:

    1. 确保路由受到auth:api 中间件的保护,该中间件指定了api 保护。但是,这将不允许客人访问该网址。

    2. config/auth.php 文件中将默认保护更改为api。这可能不是您想要做的,特别是如果您有普通的网络用户。

    3. 告诉api 守卫你想要用户的请求。 $request->user() 方法接受一个守卫作为参数,所以如果你使用$request->user('api'),它将使用api 守卫检索用户。

    4. 直接从api守卫获取用户:auth()->guard('api')->user()

    【讨论】:

    • $request->user('api');好多了,因为我的函数中已经有了 $request 对象。
    • @patricus:很好的解释伙伴!我终于明白了我错过的一点 Laravel Passport。非常感谢!
    • 我必须在标题中使用一些东西吗??
    • 也可以使用auth辅助函数传递中间件名称; auth('api')->user();
    【解决方案2】:

    身份验证中间件是返回用户的中间件。 auth:api 只是表示使用 API 防护。在 laravel 的源码中,文件vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php line 62 中,函数 shouldUse 是设置 Auth::user() 对象的函数。还可以查看vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php shouldUse 函数

    【讨论】:

      【解决方案3】:

      覆盖 createToken() 方法 app\Models\User.php 如下所示。

      public function createToken($user_id,$name, array $scopes = [])
      {
          return Container::getInstance()->make(PersonalAccessTokenFactory::class)
          ->make(
              $user_id, $name, $scopes
          );
      }
      

      并在您想要的任何地方创建如下给出的令牌并显式传递 $user_id。

      $user= new user();
      $accessToken = $user->createToken($user_id,'authToken')->accessToken;
      

      现在你会得到 $request->user()

      【讨论】:

        猜你喜欢
        • 2018-01-05
        • 2019-09-20
        • 2018-03-08
        • 2016-05-13
        • 2020-08-14
        • 2014-06-09
        • 2022-10-02
        • 1970-01-01
        • 2017-12-08
        相关资源
        最近更新 更多