Переопределение приводов spring без потери конфигурируемых конечных точек

Я пытаюсь защитить конечные точки Actuators внутри Spring Boot проекта. Однако вместо использования готовой конфигурации Spring Security для Actuators:

management:
  security:
    enabled: true
    role: ADMINISTRATOR

Слишком просто мне нужно подключить Actuators к нашей пользовательской безопасности (здесь CAS SSO).

Сначала попробуйте добавить context-path для Actuators:

management:
  security:
    enabled: true
    role: ADMINISTRATOR
  context-path: /management

И обновите конфигурацию WebSecurityConfigurerAdapter

@Override
protected void configure(HttpSecurity http) throws Exception {
    ...
    http.authorizeRequests()..antMatchers("/management/**").hasRole(Role.ADMINISTRATOR.toString());
    ...
} 

Он работает, но я должен жестко указать Actuators context-path, поэтому, когда я хочу обновить management.context-path, мне нужно обновить мою безопасность.

Я знаю, что можно получить значение management.context-path, но как управлять им, когда значение равно ""?

Вы можете ответить мне на @Autowired EndpointHandlerMapping и получить список конечных точек Actuators... Наконец, я буду копировать прошлую логику как ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter.

Кроме того, ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter @ConditionalOnMissingBean указывает себя, но ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter является внутренне-статическим защищенным классом, поэтому невозможно отключить его, не передавая параметр management.security.enabled=false, и это может быть странно, потому что ваша конфигурация говорит management.security.enabled=false, но на самом деле конечные точки защищены...


Заключение

  • Есть ли способ переопределить (только часть) правильно Actuators security
  • Могу я что-то упустить, и я совершенно не прав?

Ответ 1

Уже существует незавершенная проблема в Github. На данный момент Dave Syer предлагает:

Я думаю, что копировать-вставить весь код, на самом деле, самый лучший на данный момент (и установите для управления .security.enabled = false, чтобы позволить Boot знает, что вы хотите сделать это самостоятельно).

Я не тестировал, будет ли исключено исключение во время выполнения, но я думаю, что вы можете повторно использовать ManagementWebSecurityConfigurerAdapter и сохранить много действий по копированию. По крайней мере, компилятор не жалуется.

Поместите свой класс конфигурации в пакет org.springframework.boot.actuate.autoconfigure в свой проект и от ManagementWebSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter. Не пропустите все аннотации из ManagementWebSecurityConfigurerAdapter. Это единственное действие копирования-вставки здесь, потому что аннотации классов не могут быть унаследованы подклассом.

package org.springframework.boot.actuate.autoconfigure;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@ConditionalOnProperty(prefix = "management.security", name = "enabled", matchIfMissing = true)
@Order(ManagementServerProperties.BASIC_AUTH_ORDER)
public class SsoManagementWebSecurityConfigurerAdapter extends ManagementWebSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter {

    //TODO your SSO configuration

}

Не забывайте @Import вашу конфигурацию в @SpringBootApplication.