我遵循本教程将基于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应用程序中?
暂无答案!
目前还没有任何答案,快来回答吧!