Laravel 5.7-即使不使用身份验证中间件也如何使用Auth :: check()

时间:2018-12-15 08:20:43

标签: authentication laravel-5 routes laravel-middleware

我想构建一个API路由,该路由可以由已认证用户和未认证用户调用,并根据用户是否已认证返回数据。

我坚持使用Auth :: check()。

控制器功能如下:

class SomeController extends Controller
{
    public function check(Request $request) {
        if(Auth::check()) {
            return response()->json([
                        'message' => 'Logged in'
                    ], 200);
        }
        else {
            return response()->json([
                        'message' => 'Not logged in'
                    ], 200);
        }
    }
}

我最终遇到两种情况:

场景1

Route::get('scenario1', 'SomeController@check');

在这种情况下,在控制器中,当我在if条件中检查Auth :: check()时,无论用户是否通过身份验证,我总是会得到错误条件。

场景2

Route::get('scenario2', 'SomeController@check')->middleware('auth:api');

在这种情况下,在控制器中,当我检查Auth :: check()时,我会在用户登录时得到true,而在用户未登录时出现错误(未确定Route [登录])。

3 个答案:

答案 0 :(得分:0)

关于场景2,请阅读Protecting Routes(以及下面的“重定向未经身份验证的用户”小节)。

auth中间件附加到路由时,如果未对用户进行身份验证,则会将其重定向到名为login的路由,该路由尚未在应用程序中实现。


但是,我不明白为什么auth似乎在您的方案2中起作用,但在您的方案1中却不起作用...

答案 1 :(得分:0)

回答您的直接问题

  

即使不使用身份验证中间件,如何使用Auth :: check()

您只需使用Auth::check()。 Auth中间件并不意味着您始终可以访问Auth类,这意味着必须对用户进行身份验证才能访问/使用特定的路由。

如果您在路由上具有身份验证中间件,然后在处理该路由的控制器方法上进行了Auth::check的操作,那就总是正确的,因为中间件已阻止任何未经身份验证的用户到达该点。

编辑-不过,您可能需要使用Web中间件组。

答案 2 :(得分:0)

here回答Felix Eve

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

如果用户未通过身份验证,则返回 null