authenticationcredentialsnotfoundexception,方法安全性使用jwt身份验证

q43xntqr  于 2021-09-29  发布在  Java
关注(0)|答案(0)|浏览(303)

我遵循本教程将基于jwt的身份验证应用到我的spring boot应用程序中:https://octoperf.com/blog/2018/03/08/securing-rest-api-spring-security 但是我用的是kotlin。
根据教程,我添加了一个 TokenAuthenticationFilter 它正在扩展 AbstractAuthenticationProcessingFilter 到中的过滤器链 WebSecurityConfigurerAdapter .

override fun configure(http: HttpSecurity) = http.apply {
        //...
        authenticationProvider(authProvider)
        addFilterBefore(tokenAuthFilter, SecurityContextHolderAwareRequestFilter::class.java)
        //...

successfulAuthentication 方法此筛选器将正确设置凭据:

SecurityContextHolder.getContext().setAuthentication(authResult);

在没有方法安全性的控制器中为方法执行filterchain。登录正常,我得到一个jwt令牌,当我把它放在请求的授权头中时,我得到了正确的authenticationprincipal——因此使用端点测试时,我成功地让登录的用户返回

@GetMapping("/")
    fun whoami(@AuthenticationPrincipal user: User?) = user;

但是,只要我尝试在某个端点上使用方法安全性

@PostMapping("/upload")
    @PreAuthorize("hasAuthority('UploadArtifact')")
    fun uploadArtifact(
        @RequestParam("artifact", required = true) artifact: MultipartFile,
        @Valid @RequestParam("meta", required = true) request: UploadArtifactRequest
    ): ResponseEntity<Any> {
    //...

我得到一个authenticationcredentialsnotfoundexception
org.springframework.security.authentication.authenticationcredentialsnotfoundexception:在org.springframework.security.access.intercept.abstractsecurityinterceptor.credentialsnotfound(abstractsecurityinterceptor.java:333)~[spring-security-core-5.5.0.jar:5.5.0]处的securitycontext中未找到身份验证对象org.springframework.security.access.intercept.abstractsecurityinterceptor.beforeinvocation(abstractsecurityinterceptor.java:200)~[spring-security-core-5.5.0.jar:5.5.0]位于org.springframework.security.access.intercept.aopalliance.methodsecurityinterceptor.invoke(methodsecurityinterceptor.java:58)~[spring-security-core-5.5.5.0.0]org.springframework.aop.framework.reflectivemethodinvocation.procedue(reflectivemethodinvocation.java:186)~[spring-aop-5.3.8.jar:5.3.8]位于org.springframework.aop.framework.cglibaopproxy$cglibmethodinvocation.proceduce(cglibaopproxy.java:750)~[spring-aop-5.3.8.jar:5.3.8]org.springframework.aop.framework.cglibaopproxy$dynamicadvisedinterceptor.intercept(cglibaopproxy.java:692)~[spring-aop-5.3.8.jar:5.3.8]位于[########软件包名称编辑######].artifactcontroller$$enhancerbyspringcglib。。。
我设置断点
一开始 TokenAuthenticationFilter.successfulAuthentication 方法。
在里面 ApplicationFilterChain.doFilter 显然是两个 ApplicationFilterChain 示例在请求上运行,这两个请求都包含一个名为“springsecurityfilterchain”的委托代理链
这个 ApplicationFilterChain 首先执行的是从 StandardWrapperValve.java . 其springsecurityfilterchain不包含tokenauthenticationfilter。此处引发authenticationcredentialsnotfoundexception异常。
第二 ApplicationFilterChain 开始于 ApplicationDispatcher.java . 它的springsecurityfilterchain不包含 TokenAuthenticationFilter 并且成功地实现了身份验证,但在这一点上显然是无用的。
现在我有两个独立的问题:
如何确保及时进行身份验证?应该有两个过滤链吗?还是我把配置搞砸了?
一般来说:我应该使用这种教程吗?或者有没有更好的方法将无状态身份验证与2021年的jwt集成到spring boot应用程序中?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题