所以这里是场景。
我有登录 API,它将 jwt 令牌返回给客户端,这个 API 有注释@PermitAll
。
然后我有另一个受保护的 API,只能在验证 jwt 令牌后访问。对安全 API 的请求是以这样一种方式发送的,即Authorization
在标头中添加带有 jwt 令牌值的参数,并将请求传递给安全 API。请注意,authorization type
此 API 是No Auth
. 我写了一个类JwtRequestFilter extends OncePerRequestFilter
,我在其中拦截了请求,提取了令牌,验证了它,返回了适当的响应,一切都很好。但是有一个问题,问题是@PreAuthorize("hasAuthority('RANDOM_PRIV_1')")
控制器类中方法的顶部有注释,它没有被验证,JwtRequestFilter
实际上不应该,因为这不是它的工作。
我知道list of GrantedAuthorities
被传递给实现UserDetailsService
并通过方法得到验证loadUserByUsername
。但是我不能使用这个接口的实现,原因是,它的实现只有在 is 时才被调用,authorization type
而Basic Auth
我没有使用这种类型的身份验证。
所以我正在寻找的是一个我可以验证的接口/类GrantedAuthorities
;它的验证方式由UserDetailsService
.
如果没有这样的功能,那么我有第二个扩展工作选项,HandlerInterceptorAdapter
在 中preHandle
,我验证令牌以及验证与用户关联(manually)
的grantedAuthorities,并根据方法上存在的 PreAuthorize 注释验证它们。这对我有用,但我仍在寻找更清洁的解决方案。
PS:我也浏览了这个链接,但没有找到任何有用的信息。 没有 UserDetailsService 方法的 Spring Boot 基本身份验证。
任何帮助将非常感激。