我想构建一个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 [登录])。
答案 0 :(得分:0)
关于场景2,请阅读Protecting Routes(以及下面的“重定向未经身份验证的用户”小节)。
将auth
中间件附加到路由时,如果未对用户进行身份验证,则会将其重定向到名为login
的路由,该路由尚未在应用程序中实现。
但是,我不明白为什么auth似乎在您的方案2中起作用,但在您的方案1中却不起作用...
答案 1 :(得分:0)
回答您的直接问题
即使不使用身份验证中间件,如何使用Auth :: check()
您只需使用Auth::check()
。 Auth中间件并不意味着您始终可以访问Auth类,这意味着必须对用户进行身份验证才能访问/使用特定的路由。
如果您在路由上具有身份验证中间件,然后在处理该路由的控制器方法上进行了Auth::check
的操作,那就总是正确的,因为中间件已阻止任何未经身份验证的用户到达该点。
编辑-不过,您可能需要使用Web中间件组。
答案 2 :(得分:0)