Можете ли вы помочь защитить конечные точки привода в Spring Boot 2? Я проверил руководство по миграции, но оно мне не помогает.
Вот моя конфигурация безопасности:
@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ADMIN")
.anyRequest().authenticated();
}
}
но когда я захожу в http://localhost:8080/actuator/health, он загружается без входа в систему. Другие конечные точки с префиксом /actuator также не требуют входа в систему. Что я сделал не так?
Я также добавляю OAuth с этой конфигурацией:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.inMemory()
.withClient("client-id")
.scopes("read", "write")
.authorizedGrantTypes("password")
.secret("xxxxxx")
.accessTokenValiditySeconds(6000);
}
}
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/ajax/**").authenticated()
.and()
.csrf()
.disable();
}
}
@DenisStephanov У вас есть все настройки в одном приложении? AFAIR, тогда порядок вашей конфигурации такой: AuthorizationServerConfig (только конечные точки OAuth2), ResourceServerConfig (все конечные точки) и SecConfig (никогда не используются).
@DenisStephanov Вы должны ограничить конфигурацию своего ресурса. Например, вы можете добавить .antMatcher("/ajax/**") в конфигурацию вашего сервера ресурсов, чтобы применить конфигурацию только для /ajax/**, а не для /actuator.




Если ваше приложение является сервером ресурсов, вам не нужен класс SecConfig.
Поэтому, если вы удалите его, в своем классе ResourceServerConfig вы сможете защитить приводы и просто пропустить администратора:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/ajax/**").authenticated()
.antMatchers("/actuator/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.csrf()
.disable();
}
}
Я добавляю .anyRequest().authenticated(), чтобы защитить остальные конечные точки приложения.
Рекомендовано для упоминания решения, основанного на Resource Server и Authorization Server.
Попробовал, вроде работает, спасибо. Но это способ, как сделать весеннюю загрузку 2? Я думал, что это boot 1.5x
Да, это Spring Boot 2, конфигурация HttpSecurity не сильно меняется. Все тесты этого примера сделаны с версией 2.1.x.
вы можете попробовать конфигурацию ниже
@Configuration
public class SecConfig extends WebSecurityConfigurerAdapter {
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/actuator/**").hasRole("ACTUATOR")
.anyRequest().permitAll();
}
}
Убедитесь, что в application.properties есть следующее:
spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=ACTUATOR,USER # or any other role
management.endpoint.health.roles=ACTUATOR
это не работает для меня ... Я попытался также добавить запретить все конечные точки, чтобы проверить мою безопасность, но это не имеет никакого влияния на это: / что-то не так, но я не знаю, что
@Configuration
@Order(1)
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
log.info("configuring actuator security");
// secure actuator endpoints with with ADMIN role
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests()
.anyRequest().hasRole("ADMIN");
// but publicly allow the health endpoint
http.requestMatchers(EndpointRequest.to(HealthEndpoint.class)).permitAll()
}
}
См. также пример из документации:
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.security:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
return http.build();
}
}
В этом последнем примере имейте в виду, что конфигурация безопасности Spring Boot полностью отступает при наличии любого SecurityFilterChain bean-компонента.
@DennisGlot Я начал новые проекты, это первая конфигурация: / Я просто добавил userService и кодировщик паролей в configureGlobal (аутентификация AuthenticationManagerBuilder)