OAuth2TokenFormat» как подтип «java.lang.Object»: такой класс не найден.
Привет, ребята, я только что перешел с Springboot 2.7.* на Springboot 3. Я перенес сервер авторизации Springboot oauth2 с 0.3.1 на 1.0.1, раньше он работал хорошо, но у меня возникла проблема, я думаю, из-за привязки данных Juckson. это мой сервер конфигурации. приложение работает хорошо, я даже могу пройти аутентификацию. но когда я вызываю конечную точку авторизации, это выдает ошибку синтаксического анализатора.
это моя конфигурация:
@Configuration(proxyBeanMethods = false)
@RequiredArgsConstructor
public class AuthorizationServerConfig {
@Bean
@Order(1)
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());
http .addFilterBefore(new CORSFilter(), ChannelProcessingFilter.class);
http.exceptionHandling(exceptions -> exceptions.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")));
http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
return http.build();
}
@Bean
public OAuth2AuthorizationConsentService authorizationConsentService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
return new JdbcOAuth2AuthorizationConsentService(jdbcTemplate, registeredClientRepository);
}
@Bean
public RegisteredClientRepository registeredClientRepository(JdbcTemplate jdbcTemplate) {
return new JdbcRegisteredClientRepository(jdbcTemplate);
}
@Bean
public JWKSource<SecurityContext> jwkSource() {
RSAKey rsaKey = Jwks.generateRsa();
JWKSet jwkSet = new JWKSet(rsaKey);
return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
}
@Bean
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public AuthorizationServerSettings authorizationServerSettings() {
return AuthorizationServerSettings.builder()
.authorizationEndpoint("/oauth/authorize")
.tokenEndpoint("/oauth/token")
.jwkSetEndpoint("/oauth/jwks")
.tokenRevocationEndpoint("/oauth/revoke")
.tokenIntrospectionEndpoint("/oauth/introspect")
.oidcClientRegistrationEndpoint("/connect/register")
.oidcUserInfoEndpoint("/userinfo")
.build();
}
@Bean
public TokenSettings tokenSettings() {
return TokenSettings.builder().build();
}
@Bean
public ClientSettings clientSettings(){
return ClientSettings.builder()
.requireAuthorizationConsent(false)
.requireProofKey(false)
.build();
}
@Bean
@Primary
public OAuth2AuthorizationService authorizationService(JdbcTemplate jdbcTemplate, RegisteredClientRepository registeredClientRepository) {
JdbcOAuth2AuthorizationService authorizationService = new JdbcOAuth2AuthorizationService(jdbcTemplate, registeredClientRepository);
JdbcOAuth2AuthorizationService.OAuth2AuthorizationRowMapper rowMapper = new JdbcOAuth2AuthorizationService.OAuth2AuthorizationRowMapper(registeredClientRepository);
rowMapper.setObjectMapper(objectMapper());
authorizationService.setAuthorizationRowMapper(rowMapper);
return authorizationService;
}
@Bean
@Primary
public ObjectMapper objectMapper() {
ClassLoader classLoader = JdbcOAuth2AuthorizationService.class.getClassLoader();
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModules(new CoreJackson2Module());
objectMapper.registerModules(SecurityJackson2Modules.getModules(classLoader));
objectMapper.registerModule(new OAuth2AuthorizationServerJackson2Module());
objectMapper.registerModule(new WebJackson2Module());
return objectMapper;
}
}
это ошибка:
java.lang.IllegalArgumentException: Could not resolve type id
'org.springframework.security.oauth2.core.OAuth2TokenFormat' as a subtype of
`java.lang.Object`: no such class found at [Source: UNKNOWN; byte offset: #UNKNOWN]
at
1 ответ
Только что решил это.
org.springframework.security.oauth2.core.OAuth2TokenFormat
(0.3.1) переместилось в (1.0.1).
Я нашел (старое) каноническое имя класса в базе данных сервера авторизации, созданной с помощью 0.3.1, каждая запись клиента в таблицеoauth2_registered_client
столбецtoken_settings
содержит его. Экземпляры OAuth2TokenFormat создаются при чтении записей клиента на основе канонического имени в значениях полей. Очевидно, это больше не может работать после перемещения класса.
Решение состоит в том, чтобы убедиться, что записи в полях содержат правильное имя класса, т.е.org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat
Вы также можете
- заменить старое каноническое имя класса новым во всех записях клиента
или
- воссоздайте записи вашего клиента, удалив все записи таблицы, например
TRUNCATE `oauth2_registered_client`;
)
После этого должен запуститься сервер авторизации.
Удачи!