Как защитить конечные точки привода с ролью в Spring Boot 2?

Можете ли вы помочь защитить конечные точки привода в 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();
    }
}

@DennisGlot Я начал новые проекты, это первая конфигурация: / Я просто добавил userService и кодировщик паролей в configureGlobal (аутентификация AuthenticationManagerBuilder)

Denis Stephanov 13.05.2019 21:45

@DenisStephanov У вас есть все настройки в одном приложении? AFAIR, тогда порядок вашей конфигурации такой: AuthorizationServerConfig (только конечные точки OAuth2), ResourceServerConfig (все конечные точки) и SecConfig (никогда не используются).

dur 16.05.2019 00:42

@DenisStephanov Вы должны ограничить конфигурацию своего ресурса. Например, вы можете добавить .antMatcher("/ajax/**") в конфигурацию вашего сервера ресурсов, чтобы применить конфигурацию только для /ajax/**, а не для /actuator.

dur 16.05.2019 00:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
3
9 848
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Если ваше приложение является сервером ресурсов, вам не нужен класс 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.

nortontgueno 16.05.2019 15:52

Попробовал, вроде работает, спасибо. Но это способ, как сделать весеннюю загрузку 2? Я думал, что это boot 1.5x

Denis Stephanov 17.05.2019 16:02

Да, это Spring Boot 2, конфигурация HttpSecurity не сильно меняется. Все тесты этого примера сделаны с версией 2.1.x.

Francesc Recio 17.05.2019 17:43

вы можете попробовать конфигурацию ниже

@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

это не работает для меня ... Я попытался также добавить запретить все конечные точки, чтобы проверить мою безопасность, но это не имеет никакого влияния на это: / что-то не так, но я не знаю, что

Denis Stephanov 16.05.2019 20:47
@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-компонента.

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