我正在使用Spring Security和JWT授权,最近我试图将我的Spring Security升级到最新版本(6.1.1),但是对于非Map的API路由,我总是得到403 Forbidden而不是404 Not Found,即使正确设置了授权令牌。我创建了一个JWTFilter,它总是在身份验证流程中被调用。如果身份验证成功,它将在上下文中设置Authentication对象(请参阅下面的代码粘贴)。
我激活了TRACE日志记录,这是当我尝试调用一个没有在SecurityConfig中Map的路径时的日志。
2023-06-28T19:42:18.740+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Trying to match request against DefaultSecurityFilterChain [RequestMatcher=any request, Filters=[org.springframework.security.web.session.DisableEncodeUrlFilter@4126cd58, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7ecd90ea, org.springframework.security.web.context.SecurityContextHolderFilter@e25af5a, org.springframework.security.web.header.HeaderWriterFilter@34734cf6, org.springframework.security.web.authentication.logout.LogoutFilter@5901af8b, org.greenhill.application.config.security.JwtTokenFilter@19098979, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6df7193b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@57640814, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@bad144f, org.springframework.security.web.session.SessionManagementFilter@6921fa4d, org.springframework.security.web.access.ExceptionTranslationFilter@7a88c97f, org.springframework.security.web.access.intercept.AuthorizationFilter@7a98b997]] (1/1)
2023-06-28T19:42:18.740+01:00 DEBUG 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Securing POST /test
2023-06-28T19:42:18.740+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking DisableEncodeUrlFilter (1/12)
2023-06-28T19:42:18.740+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking WebAsyncManagerIntegrationFilter (2/12)
2023-06-28T19:42:18.740+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SecurityContextHolderFilter (3/12)
2023-06-28T19:42:18.740+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking HeaderWriterFilter (4/12)
2023-06-28T19:42:18.741+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking LogoutFilter (5/12)
2023-06-28T19:42:18.741+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.a.logout.LogoutFilter : Did not match request to Or [Ant [pattern='/logout', GET], Ant [pattern='/logout', POST], Ant [pattern='/logout', PUT], Ant [pattern='/logout', DELETE]]
2023-06-28T19:42:18.741+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking JwtTokenFilter (6/12)
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking RequestCacheAwareFilter (7/12)
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SecurityContextHolderAwareRequestFilter (8/12)
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking AnonymousAuthenticationFilter (9/12)
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SessionManagementFilter (10/12)
2023-06-28T19:42:18.743+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.a.AnonymousAuthenticationFilter : Did not set SecurityContextHolder since already authenticated UsernamePasswordAuthenticationToken [Principal=org.greenhill.auth.repository.entity.Worker@6586a89e, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[]]
2023-06-28T19:42:18.744+01:00 TRACE 6970 --- [nio-8080-exec-4] s.CompositeSessionAuthenticationStrategy : Preparing session with ChangeSessionIdAuthenticationStrategy (1/1)
2023-06-28T19:42:18.744+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking ExceptionTranslationFilter (11/12)
2023-06-28T19:42:18.744+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking AuthorizationFilter (12/12)
2023-06-28T19:42:18.744+01:00 TRACE 6970 --- [nio-8080-exec-4] estMatcherDelegatingAuthorizationManager : Authorizing SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@61b920f6]
2023-06-28T19:42:18.747+01:00 TRACE 6970 --- [nio-8080-exec-4] estMatcherDelegatingAuthorizationManager : Checking authorization on SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@61b920f6] using org.springframework.security.authorization.AuthenticatedAuthorizationManager@e8f8395
2023-06-28T19:42:18.748+01:00 DEBUG 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Secured POST /test
2023-06-28T19:42:18.749+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match request to [Is Secure]
2023-06-28T19:42:18.752+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Trying to match request against DefaultSecurityFilterChain [RequestMatcher=any request, Filters=[org.springframework.security.web.session.DisableEncodeUrlFilter@4126cd58, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@7ecd90ea, org.springframework.security.web.context.SecurityContextHolderFilter@e25af5a, org.springframework.security.web.header.HeaderWriterFilter@34734cf6, org.springframework.security.web.authentication.logout.LogoutFilter@5901af8b, org.greenhill.application.config.security.JwtTokenFilter@19098979, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@6df7193b, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@57640814, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@bad144f, org.springframework.security.web.session.SessionManagementFilter@6921fa4d, org.springframework.security.web.access.ExceptionTranslationFilter@7a88c97f, org.springframework.security.web.access.intercept.AuthorizationFilter@7a98b997]] (1/1)
2023-06-28T19:42:18.752+01:00 DEBUG 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Securing POST /error
2023-06-28T19:42:18.752+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking DisableEncodeUrlFilter (1/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking WebAsyncManagerIntegrationFilter (2/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SecurityContextHolderFilter (3/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking HeaderWriterFilter (4/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking LogoutFilter (5/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.a.logout.LogoutFilter : Did not match request to Or [Ant [pattern='/logout', GET], Ant [pattern='/logout', POST], Ant [pattern='/logout', PUT], Ant [pattern='/logout', DELETE]]
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking JwtTokenFilter (6/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking RequestCacheAwareFilter (7/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SecurityContextHolderAwareRequestFilter (8/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking AnonymousAuthenticationFilter (9/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking SessionManagementFilter (10/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking ExceptionTranslationFilter (11/12)
2023-06-28T19:42:18.753+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.security.web.FilterChainProxy : Invoking AuthorizationFilter (12/12)
2023-06-28T19:42:18.754+01:00 TRACE 6970 --- [nio-8080-exec-4] estMatcherDelegatingAuthorizationManager : Authorizing SecurityContextHolderAwareRequestWrapper[ FirewalledRequest[ org.apache.catalina.core.ApplicationHttpRequest@1ef57c0b]]
2023-06-28T19:42:18.755+01:00 TRACE 6970 --- [nio-8080-exec-4] estMatcherDelegatingAuthorizationManager : Checking authorization on SecurityContextHolderAwareRequestWrapper[ FirewalledRequest[ org.apache.catalina.core.ApplicationHttpRequest@1ef57c0b]] using org.springframework.security.authorization.AuthenticatedAuthorizationManager@e8f8395
2023-06-28T19:42:18.755+01:00 TRACE 6970 --- [nio-8080-exec-4] .s.s.w.c.SupplierDeferredSecurityContext : Created SecurityContextImpl [Null authentication]
2023-06-28T19:42:18.755+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.a.AnonymousAuthenticationFilter : Set SecurityContextHolder to AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]]
2023-06-28T19:42:18.756+01:00 TRACE 6970 --- [nio-8080-exec-4] o.s.s.w.a.ExceptionTranslationFilter : Sending AnonymousAuthenticationToken [Principal=anonymousUser, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=null], Granted Authorities=[ROLE_ANONYMOUS]] to authentication entry point since access is denied
org.springframework.security.access.AccessDeniedException: Access Denied
at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:98) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:126) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:120) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:91) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:85) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:100) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:179) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:107) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:93) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:82) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.context.SecurityContextHolderFilter.doFilter(SecurityContextHolderFilter.java:69) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:227) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.wrapFilter(ObservationFilterChainDecorator.java:240) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$AroundFilterObservation$SimpleAroundFilterObservation.lambda$wrap$0(ObservationFilterChainDecorator.java:323) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$ObservationFilter.doFilter(ObservationFilterChainDecorator.java:224) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.ObservationFilterChainDecorator$VirtualFilterChain.doFilter(ObservationFilterChainDecorator.java:137) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:233) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:191) ~[spring-security-web-6.1.1.jar:6.1.1]
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:352) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:268) ~[spring-web-6.0.9.jar:6.0.9]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.9.jar:6.0.9]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.0.9.jar:6.0.9]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:101) ~[spring-web-6.0.9.jar:6.0.9]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:642) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:410) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:340) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:277) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:358) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:222) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:894) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-10.1.8.jar:10.1.8]
at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]
2023-06-28T19:42:18.763+01:00 DEBUG 6970 --- [nio-8080-exec-4] o.s.s.w.a.Http403ForbiddenEntryPoint : Pre-authenticated entry point called. Rejecting access
2023-06-28T19:42:22.075+01:00 INFO 6970 --- [ionShutdownHook] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-06-28T19:42:22.080+01:00 INFO 6970 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2023-06-28T19:42:22.095+01:00 INFO 6970 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
Process finished with exit code 130 (interrupted by signal 2: SIGINT)
这是我的SecurityConfig类:
@Configuration
@EnableMethodSecurity
public class SecurityConfiguration {
private final AuthRepository authRepository;
private final JwtTokenFilter jwtTokenFilter;
public SecurityConfiguration(AuthRepository authRepository, JwtTokenFilter jwtTokenFilter) {
this.authRepository = authRepository;
this.jwtTokenFilter = jwtTokenFilter;
}
@Bean
public SecurityFilterChain jwtFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(request -> request.requestMatchers("/auth/**")
.permitAll().anyRequest().authenticated())
.sessionManagement(manager -> manager.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authenticationProvider(authenticationProvider())
.addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class);
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
UserDetailsService userDetailsService = username -> authRepository.findByEmail(username)
.orElseThrow(
() -> new UsernameNotFoundException("User " + username + " not found."));
authProvider.setUserDetailsService(userDetailsService);
authProvider.setPasswordEncoder(passwordEncoder());
return authProvider;
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration config)
throws Exception {
return config.getAuthenticationManager();
}
}
这是我的JwtTokenFilter类
@Component
public class JwtTokenFilter extends OncePerRequestFilter {
private final JwtTokenUtil jwtTokenUtil;
public JwtTokenFilter(JwtTokenUtil jwtTokenUtil) {
this.jwtTokenUtil = jwtTokenUtil;
}
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (!hasAuthorizationBearer(request)) {
filterChain.doFilter(request, response);
return;
}
String token = getAccessToken(request);
if (!jwtTokenUtil.validateAccessToken(token)) {
filterChain.doFilter(request, response);
return;
}
setAuthenticationContext(token, request);
filterChain.doFilter(request, response);
}
private boolean hasAuthorizationBearer(HttpServletRequest request) {
String header = request.getHeader("Authorization");
if (ObjectUtils.isEmpty(header) || !header.startsWith("Bearer")) {
return false;
}
return true;
}
private String getAccessToken(HttpServletRequest request) {
String header = request.getHeader("Authorization");
String token = header.split(" ")[1].trim();
return token;
}
private void setAuthenticationContext(String token, HttpServletRequest request) {
UserDetails userDetails = getUserDetails(token);
UsernamePasswordAuthenticationToken
authentication = new UsernamePasswordAuthenticationToken(userDetails, null, null);
authentication.setDetails(
new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
private UserDetails getUserDetails(String token) {
Worker worker = new Worker();
String[] jwtSubject = jwtTokenUtil.getSubject(token).split(",");
worker.setId(UUID.fromString(jwtSubject[0]));
worker.setEmail(jwtSubject[1]);
return worker;
}
}
当我调用/auth/sign-in
或/auth/sign-up
时,它可以完美地工作。有谁知道这里可能有什么问题吗?
从上面的日志来看,显然Spring Security执行了两次相同的FilterChain。第一次它可以成功地进行身份验证,但第二次它没有,然后AnonymousAuthenticationFilter
抛出Access Denied
我尝试在不是/auth/sign-in
或/auth/sign-up
的路径中调用我的API,而不是得到404,我总是得到403禁止。
1条答案
按热度按时间oalqel3c1#
您需要像这样创建入口点身份验证: