Конечные точки конечного устройства Spring по умолчанию защищены базовой защитой http.
Можно ли это изменить, чтобы использовать Spring Безопасность? Я успешно установил Spring Security и использовал это, чтобы защитить другие страницы.
Я пробовал security.basic.enabled: false
и добавлял .antMatchers("/manage/**").hasRole("ADMIN")
в мои запросы авторизации (обратите внимание, что я использую другой URL-адрес как root для конечных точек), но это не помогло.
Я продолжаю получать базовый протокол HTTP auth, который не настроен пользователями в AuthenticationManager.
Любая идея?
EDIT - предоставление более подробной информации -
My Application.java выглядит так:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application extends WebMvcConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/app").setViewName("app/index");
registry.addViewController("/app/login").setViewName("app/login");
}
@Bean
public ApplicationSecurity applicationSecurity() {
return new ApplicationSecurity();
}
@Order(Ordered.LOWEST_PRECEDENCE - 8)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// @formatter:off
auth.inMemoryAuthentication()
.withUser("test1")
.password("test1pw")
.roles("USER", "ADMIN")
.and()
.withUser("test2")
.password("test2pw")
.roles("USER");
// @formatter:on
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
.and()
.formLogin()
.loginPage("/app/login")
.failureUrl("/app/login?error")
.defaultSuccessUrl("/app")
.permitAll()
.and()
.logout()
.logoutUrl("/app/logout")
.logoutSuccessUrl("/app/login?logout");
// @formatter:on
}
@Override
public void configure(WebSecurity web) throws Exception {
// @formatter:off
web
.ignoring()
.antMatchers("/assets/**");
// @formatter:on
}
}
}
В моем application.yml
у меня также есть:
management:
context-path: /management
Обратите внимание, что установка - это то же самое, что вы указали руководство.
Теперь то, что я ожидал бы - или хотел бы настроить - это то, что конечные точки /manage, такие как здоровье, сопоставления и т.д., будут защищены пользователями из настраиваемого AuthenticationManager.
Я также попытался добавить management.security.enabled=false
, и это действительно отключает проверку подлинности, например./Управления/отображения.
Тем не менее, проблема заключается в том, что я явно сказал Spring Security для защиты этих URL:
@Override
protected void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/app/login").permitAll()
.antMatchers("/app/**").hasRole("USER")
.antMatchers("/manage/**").hasRole("ADMIN")
но это не работает. Обратите внимание, что другие автоматы разрешения работают.
Интересно, есть ли что-то делать в сроки/порядок. Я скопировал @Order(Ordered.LOWEST_PRECEDENCE - 8)
из образца, но я не знаю, почему - используется 8.
Чтобы немного углубиться, я также запускал образец (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-samples/spring-boot-sample-web-method-security), и я вижу то же поведение в образце приложения.
Безопасность управления кажется полностью независимой от пользователей user
и admin
, настроенных в образце в аутентификации памяти.