Конфигурирование безопасности приводов

Конечные точки конечного устройства 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 в этом случае, чтобы избежать создания собственного.