我有一个路线,我在那里使用认证中间件,它的工作很好。
Route::group(['prefix' => 'v1','middleware' => ['auth:api']], function()
{
Route::resource('user', 'v1\MyController');
});
问题是,我也希望这个路由可以被未认证的用户访问。使用上面的方法,我得到了一个401 Unauthorized错误,我不能为未认证的用户返回任何内容。那么,我如何认证这个路由(以便它传递用户数据),同时即使用户没有通过认证,也允许路由继续?
(我试着在路由器页面上做一个有条件的Auth检查,但似乎用户已经通过了身份验证,所以它总是假的。)
编辑:我还应该注意到,我正在使用一个API路由与密码授予和访问令牌。
8条答案
按热度按时间xxslljrj1#
从当前路由组中删除此路由(应用认证中间件)。
然后
然后
7tofc5zh2#
我正在经历同样的情况。
由于auth中间件只检查经过验证的用户,因此我们可以使用未经过验证的用户的客户端凭证。
客户端凭证具有位于Laravel\Passport\Http\Middleware\CheckClientCredentails中的单独中间件。
我已经创建了一个自定义中间件来合并这两个中间件,以允许任何一个通过。
下面是我定制中间件
Kernal.php
routes\api.php
fhg3lkii3#
在一个未经身份验证的(未分配auth:API中间件)路由的处理程序方法中,尝试:
Auth::guard("api")->user();
如果它被填充了,那么你的无防护路由就可以将访问视为经过身份验证的。如果没有,它是一个随机的用户访问路由,可以被这样对待。
pb3skfrl4#
不要把那些你想同时允许访客用户和认证用户访问的网址放在认证中间件中,因为认证中间件只允许认证用户访问。
要检查已验证和未验证的用户,可以在视图中使用以下代码
编辑:在控制器使用中
0wi1tuuw5#
@Yves的答案几乎是正确的。但是一个小的变化,
代替array_key_exists,我们需要检查key value是否不为null。因为它总是有那个键,但值为null。所以,代替控制器构造这样的授权头检查。
然后,您可以像这样检查经过身份验证的用户:
vnjpjtjt6#
供圣所用途:
z9zf31ra7#
我已经用另一种方法解决了我的问题。从中间件组中删除路由,并在控制器的构造中检查用户是否经过身份验证,如果经过身份验证,您可以为该会话传播经过身份验证的用户。在我的场景中,我确实需要检查用户是否在API JsonResource中经过身份验证。
fhity93d8#
您可以使用以下示例: