У меня есть приложение, которое состоит из внешнего интерфейса Angular, внутреннего загрузочного модуля и службы REST, где я получаю свои ресурсы и данные.Все защищено тем же экземпляром Keycloak.До сих пор я аутентифицировал приложение с токеном-носителем, который создается во внешнем интерфейсе, затем устанавливается в качестве заголовка для бэкэнда с пружинной загрузкой, который затем отправляет его службе через KeycloakRestTemplate.
проблема, с которой я сталкиваюсь при таком подходе, заключается в том, что аутентификация зависит от пользователя, существовавшего до выполнения какой-либо работы бэкэндом.Из того, что я знаю, есть способ аутентификации с использованием credentials.secret
, но я не уверен, как это сделать, и не могу найти на нем никаких ресурсов.
Конфигурация Keycloak существует водна область, где у сервера весенней загрузки есть клиент resource: cl-gui
, а у остальных - другой клиент resource: cl-data
Вот мой SecurityConfig:
@Configuration
@ComponentScan(
basePackageClasses = KeycloakSecurityComponents.class,
excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
@EnableWebSecurity
public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter
{
@Value("${application.production:true}")
Boolean isProduction;
private final KeycloakClientRequestFactory keycloakClientRequestFactory;
public SecurityConfiguration(KeycloakClientRequestFactory keycloakClientRequestFactory) {
this.keycloakClientRequestFactory = keycloakClientRequestFactory;
// SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
/**
* Registers the KeycloakAuthenticationProvider with the authentication manager.
*/
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
public KeycloakRestTemplate keycloakRestTemplate() {
return new KeycloakRestTemplate(keycloakClientRequestFactory);
}
/**
*
* Load Keycloak configuration from application.properties or application.yml
*/
@Bean
public KeycloakConfigResolver keycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
/**
* Defines the session authentication strategy.
*/
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new NullAuthenticatedSessionStrategy();
}
@Bean
public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean(
KeycloakAuthenticationProcessingFilter filter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
registrationBean.setEnabled(false);
return registrationBean;
}
@Bean
public FilterRegistrationBean keycloakPreAuthActionsFilterRegistrationBean(
KeycloakPreAuthActionsFilter filter) {
FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
registrationBean.setEnabled(false);
return registrationBean;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
if (isProduction) {
http.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.sessionAuthenticationStrategy(sessionAuthenticationStrategy())
.and()
.authorizeRequests()
.antMatchers("/**").hasRole("ROLE_USER")
.anyRequest().permitAll();
} else {
http.csrf().disable().authorizeRequests().anyRequest().permitAll();
}
}
}
Зависимости Keycloak:
<!-- Keycloak -->
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-security-adapter</artifactId>
</dependency>
Как лучше всего получать информацию в таком приложении, где вы получаете данные из сервиса без аутентификации пользователя?(аутентификация клиента под ключ)