Spring 安全 OAuth2 v5:NoSuchBeanDefinitionException:'org.springframework.security.oauth2.jwt.JwtDecoder'
Spring Security OAuth2 v5 : NoSuchBeanDefinitionException: 'org.springframework.security.oauth2.jwt.JwtDecoder'
我有一个 Spring 启动应用程序,我正在尝试将其从较旧的 Spring Security OAuth 2.x 库更新到较新的 Spring Security 5。5.x。最初我的配置 class 使用 @EnableResourceServer
注释,但是根据迁移指南,这已被 Spring 安全 oauth2ResourceServer
DSL 方法取代。
我已经添加了自定义 JWT 身份验证转换器,但现在在启动时收到以下警告:
09:30:51.591 [, , ] [main] WARN %->5level org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
我还看不到过滤器链中这个 JwtDecoder
的使用位置,但它阻止了我的应用程序启动。
@Configuration
@Order(OAuthTokenApiSecurityConfig.ORDER)
public class OAuthTokenApiSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception { // NOPMD
// @formatter:off
http
.requestMatcher(new OAuth2RequestMatcher())
...
...
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(customTokenAuthenticationConverter());
// @formatter:on
}
@Bean
public CustomTokenAuthenticationConverter customTokenAuthenticationConverter() {
return new CustomTokenAuthenticationConverter();
}
@Bean
public JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter() {
return new JwtGrantedAuthoritiesConverter();
}
}
dependecies {
api("org.springframework.security:spring-security-oauth2-resource-server")
api("org.springframework.security:spring-security-oauth2-core")
api("org.springframework.security:spring-security-oauth2-jose")
api("com.nimbusds:nimbus-jose-jwt")
}
springBootVersion=2.5.3
springSecurity=5.5.1
是否缺少某些依赖项,或者是否存在某些配置或其他内容?
JwtDecoder 在 Jwt 配置中用于解码,并根据 public 密钥验证传入令牌。
JwtDecoders
class.
中的一些工厂方法提供了多种构建 bean 的方法
具体来说,
JwtDecoders.fromIssuerUri(...)
和 JwtDecoders.fromOidcIssuerUri(...)
我相信现在有第三种直接指向键的方法。
如果您 want/need 手动构建一个解码器,则可以在 jwt
配置的 decoder
方法中显式设置解码器,例如想要向 JwtDecoder
.
添加更多验证
如果您阅读 OAuth2ResourceServerConfigurer
的 javadoc,还可以选择通过 jwkSetUri
方法设置 Jwk Set URI,这也将构建一个解码器。
使用 JwtDecoder
的确切点在 JwtAuthenticationProvider
内,最终将从 BearerTokenAuthenticationFilter
调用
我有一个 Spring 启动应用程序,我正在尝试将其从较旧的 Spring Security OAuth 2.x 库更新到较新的 Spring Security 5。5.x。最初我的配置 class 使用 @EnableResourceServer
注释,但是根据迁移指南,这已被 Spring 安全 oauth2ResourceServer
DSL 方法取代。
我已经添加了自定义 JWT 身份验证转换器,但现在在启动时收到以下警告:
09:30:51.591 [, , ] [main] WARN %->5level org.springframework.web.context.support.AnnotationConfigWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'springSecurityFilterChain' defined in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.servlet.Filter]: Factory method 'springSecurityFilterChain' threw exception; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.oauth2.jwt.JwtDecoder' available
我还看不到过滤器链中这个 JwtDecoder
的使用位置,但它阻止了我的应用程序启动。
@Configuration
@Order(OAuthTokenApiSecurityConfig.ORDER)
public class OAuthTokenApiSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception { // NOPMD
// @formatter:off
http
.requestMatcher(new OAuth2RequestMatcher())
...
...
.oauth2ResourceServer()
.jwt()
.jwtAuthenticationConverter(customTokenAuthenticationConverter());
// @formatter:on
}
@Bean
public CustomTokenAuthenticationConverter customTokenAuthenticationConverter() {
return new CustomTokenAuthenticationConverter();
}
@Bean
public JwtGrantedAuthoritiesConverter jwtGrantedAuthoritiesConverter() {
return new JwtGrantedAuthoritiesConverter();
}
}
dependecies {
api("org.springframework.security:spring-security-oauth2-resource-server")
api("org.springframework.security:spring-security-oauth2-core")
api("org.springframework.security:spring-security-oauth2-jose")
api("com.nimbusds:nimbus-jose-jwt")
}
springBootVersion=2.5.3
springSecurity=5.5.1
是否缺少某些依赖项,或者是否存在某些配置或其他内容?
JwtDecoder 在 Jwt 配置中用于解码,并根据 public 密钥验证传入令牌。
JwtDecoders
class.
具体来说,
JwtDecoders.fromIssuerUri(...)
和 JwtDecoders.fromOidcIssuerUri(...)
我相信现在有第三种直接指向键的方法。
如果您 want/need 手动构建一个解码器,则可以在 jwt
配置的 decoder
方法中显式设置解码器,例如想要向 JwtDecoder
.
如果您阅读 OAuth2ResourceServerConfigurer
的 javadoc,还可以选择通过 jwkSetUri
方法设置 Jwk Set URI,这也将构建一个解码器。
使用 JwtDecoder
的确切点在 JwtAuthenticationProvider
内,最终将从 BearerTokenAuthenticationFilter