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

Вы также можете

  1. заменить старое каноническое имя класса новым во всех записях клиента

или

  1. воссоздайте записи вашего клиента, удалив все записи таблицы, напримерTRUNCATE `oauth2_registered_client`;)

После этого должен запуститься сервер авторизации.

Удачи!

Другие вопросы по тегам