Конфигурирование безопасности приводов
Конечные точки конечного устройства 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
, настроенных в образце в аутентификации памяти.
Ответы
Ответ 1
Можно ли это изменить, чтобы использовать Spring Безопасность?
Spring Безопасность (что еще вы думаете, что мы будем использовать?). Если вы просто хотите сохранить правила безопасности по умолчанию и настроить AuthenticationManager
, он должен работать, только если вы используете AuthenticationManagerBuilder
, как рекомендовано командой Spring Security. безопасный образец метода имеет поведение, которое вы ищете, поэтому вы можете скопировать шаблон конфигурации оттуда. Главное, если вы хотите заменить стратегию аутентификации загрузки по умолчанию, - это настроить AuthenticationManager
в GlobalAuthenticationConfigurerAdapter
как в примере.
Вы можете отключить управление безопасностью с помощью management.security.enabled=false
(при условии, что Spring Безопасность находится в пути к классам). Он упоминается в руководстве пользователя, но не стесняйтесь предлагать пояснения.
Ответ 2
Я бы сказал, что иногда проще исключить автоконфигурацию компонента Spring Boot и сделать конфигурацию с нуля, если у вас есть очень конкретный случай. В этом случае вы можете использовать:
@EnableAutoConfiguration(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
Или просто ManagementWebSecurityConfiguration.java
, если вы хотите сохранить остальную конфигурацию Boot Security. И тогда вы можете использовать что-то вроде этого:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter {
private final SecurityProperties securityProperties;
@Autowired
AuthenticationSecurity(SecurityProperties securityProperties) {
this.securityProperties = securityProperties;
}
@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
// configuration
}
}
@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
private SecurityProperties security;
@Autowired
protected ApplicationSecurity(SecurityProperties security) {
this.security = security;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// you configuration
}
}
}
Как вы можете видеть, я повторно использовал SecurityProperties в этом случае, чтобы избежать создания собственного.