我正在使用一个使用oauth2-server-laravel包(5.1.x)的Laravel 5(.2.x)应用程序。
此软件包附带一些中间件,用于根据用户在请求中提供的access_token来确定用户是否经过身份验证。 documentation表示在$routeMiddleware
数组(Http Kernel的一部分)中注册此中间件。如果我使用无效的access_token访问应用程序,我会按预期获得HTTP 401。
我在我的Controller中使用隐式路由绑定,如下所示:
<?php
class UserController extends Controller
{
public function show(User $user)
{
return $user;
}
}
这很有效 - 当我将有效ID作为授权用户传递时,我在JSON响应中获得了正确的User对象。同样,当我将有效ID作为未经授权的用户传递时,我会从OAuth中间件获得401.
当我强制未经授权请求无效用户时出现问题,我得到了Laravel 404例外:
Illuminate\Database\Eloquent\ModelNotFoundException
(No query results for model [App\User])
我希望从包中获得拒绝访问权限(League\OAuth2\Server\Exception\AccessDeniedException
)作为正常的未经授权的请求。除了“您未经授权”之外,我并不特别想向未经授权的用户提供任何信息。
根据我的收集,这是因为Laravel的路由器在执行自定义路由中间件之前处理任何隐式绑定(Illuminate\Routing\Router::substituteImplicitBindings($route)
)。
我正在努力解决这个问题 - 我不确定我是否不理解如何正确使用中间件,或者这是否是Laravel的限制。
我想知道是否有其他人有更好的解决方案,或者可以告诉我,我会以错误的方式解决这个问题!