У меня есть приложение Angular frontend, которое аутентифицировано с помощью Keycloak, и оттуда я вызываю сервер Spring Backend Resource, передавая ему accesss_token для проверки с помощью keycloak. В качестве приложения CORS для бэкенда я добавил @Bean corsConfigurationSource () в WebSecurityConfigAdapterс предпочтением Ordered.HIGHEST PREFERNCE, чтобы иметь приоритет перед Oauth2ProcessingFiter.Initial. Запрос OPTION проходит с заголовком ответа из фильтра CORS, во-вторых, фактический запрос ресурса также через фильтр CORS и OAuth2Processfilter не вызывается, и, следовательно, он является единственным пользователем, даже еслиПользователь в Keycloak.
@EnableWebSecurity
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.cors().and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedHeaders(Arrays.asList("authorization"));
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
UrlBasedCorsConfigurationSource source = new
UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}
@SpringBootApplication
@EnableResourceServer
public class VehicleApplication {
public static void main(String[] args) {
SpringApplication.run(VehicleApplication.class, args);
}
}
application.yml
security:
oauth2:
resource:
user-info-uri: http://localhost:8080/auth/realms/VMS/protocol/openid-
connect/userinfo
pom.xml
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Ожидаемый фильтр CORS, который будет применен для предварительной проверки только один раз и разрешить и последующий запрос пройти через Oauth2ProcessingGilter