Не могли бы вы указать мне, является ли это недоразумением/неправильной настройкой/ошибкой? Спасибо.
Вопрос:
Как настроить привод, чтобы разрешить анонимные вызовы к обеим конечным точкам: /actuator/health и / привод/здоровье/пользователь с простым ответом (без подробностей и компонентов). И обе конечные точки возвращают полную информацию для аутентифицированных (и авторизованных) запросов.
К сожалению, ситуация осложняется настройкой безопасности Spring...
У меня две области
- /api/** для приложений SPA с аутентификацией JWT
- /api2/** для других инструментов с базовой аутентификацией
- (больше ничего явно не обрабатывается. Таким образом, /actuator/** доступен для всех)
Код: Выделить всё
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
...
return Health
.status(...)
.withDetail("detailDto", detailDto)
.build();
}
}
management.endpoint.health.show-details=never
Ожидаемый ответ для /actuator/health
Код: Выделить всё
{"status":"DOWN"}
Код: Выделить всё
{
"status": "DOWN",
"components": {
"blobStorage": {
"status": "DOWN",
"details": ...
},
"diskSpace": {
"status": "UP",
"details": ...
},
"custom": {
"status": "UP",
"details": ...
},
"ping": {
"status": "UP"
}
}
}
То, что подробности доступны в конфигурации по умолчанию, выглядит для меня как ОШИБКА.
Случай 2: изменена конфигурация
Код: Выделить всё
management.endpoint.health.show-details=when-authorized
Реальный ответ для /actuator/health такой же, как и ожидалось – просто статус: {"status":"DOWN" >. НО реальный ответ для /actuator/health/custom — HTTP 404 НЕ НАЙДЕН?!? Почему вся пользовательская конечная точка работоспособности отключена? И если таковые имеются, то я ожидал бы HTTP 401 UNAUTHENTICATED. Похоже на ОШИБКУ. В любом случае, я ожидал, что /actuator/health/custom будет работать, но без подробностей:
Код: Выделить всё
{"status":"DOWN"}
Код: Выделить всё
management.endpoint.health.show-components=when-authorized
management.endpoint.health.show-details=when-authorized
Код: Выделить всё
@Configuration
@Order(3)
public static class ActuatorSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/actuator/**")
.authorizeRequests(authorize -> authorize
.anyRequest().permitAll()
)
.httpBasic();
// ?????
}
}
Если вы защитили свое приложение и хотите использовать его всегда, ваша конфигурация безопасности должна разрешать доступ к конечной точке работоспособности для как аутентифицированных, так и неаутентифицированных пользователей.
Подробнее здесь: https://stackoverflow.com/questions/691 ... d-security