通过@Profile启用 WebSecurityConfigurer 不起作用

我认为,我有一个非常简单和基本的设置,用于在本地运行带有一些身份验证的Spring Boot Web应用程序。

我希望当我通过Spring Boot运行此应用程序时,我的自定义安全设置将在我指定配置文件时覆盖默认行为。local

mvn -Dspring.profiles.active="local" spring-boot:run

也许我指定了错误,但是当应用程序运行时,它仍然会吐出生成的密码以供使用,并且似乎不允许在没有所述身份验证的情况下访问该路径。profiles.active/login

我也没有看到活动配置文件,这可能有点说明问题。/env

我有一个覆盖的,像这样:WebSecurityConfigurer

@Configuration
@EnableWebSecurity
@Profile("local")
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().fullyAuthenticated().and().formLogin().permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("admin").password("admin").roles("ADMIN", "USER")
        .and().withUser("user").password("user").roles("USER");

    }
}

我的主要类是你的标准Spring Java风格的基本配置:@Configuration

@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

答案 1

我想我遇到了同样的问题。我想使用Spring配置文件在无,基本,表单等身份验证之间进行选择。但是,如果我将 、 和 放在类上,就像它们在示例中所示的那样,当我不想要身份验证时,基本身份验证有时处于活动状态。@Profile@Configuration@EnableWebMvcSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter@SpringBootApplication

我通过用 而不是 @Configurations(代码片段在 Groovy 中)制作 bean 实现了我想要的:WebSecurityConfigurerAdapter

@Configuration
@EnableWebMvcSecurity
class SecurityConfig {
    @Bean
    @Profile('no-auth')
    WebSecurityConfigurerAdapter noAuth() {
        new WebSecurityConfigurerAdapter() {
            @Override
            void configure(HttpSecurity http) throws Exception {
                http.authorizeRequests().anyRequest().permitAll()
            }
        }
    }

    @Bean
    @Profile('default')
    WebSecurityConfigurerAdapter basic() {
        new WebSecurityConfigurerAdapter() {
            @Override
            void configure(HttpSecurity http) throws Exception {
                http
                    .authorizeRequests()
                        .antMatchers('/').permitAll()
                        .anyRequest().authenticated()
                        .and()
                    .httpBasic()
            }

            @Override
            public void configure(AuthenticationManagerBuilder auth) throws Exception {
                auth
                    .inMemoryAuthentication()
                        .withUser("user").password("password").roles("USER");
            }
        }
    }
}

答案 2

第二次尝试更好地控制安全设置。用于控制安全自动配置的高级选项是什么:

  • 完全且永久地关闭安全性:
    • 从类路径中删除 Spring Security
    • 或 exlude security auto config - @EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
  • 通过设置 security.basic.enabled=false 来关闭默认的基本身份验证安全性

如果您完全控制了如何使用安全设置,安全性自动配置和弹簧配置文件,则很容易控制不同的安全设置。

@Configuration
@ComponentScan
public class Application {
    public static void main(String[] args) throws Throwable {
        SpringApplication.run(Application.class, args);
    }
}

@Configuration
public class WebSecurityConfig {

    @Configuration
    @EnableAutoConfiguration(exclude = SecurityAutoConfiguration.class)
    @ConditionalOnExpression("!${my.security.enabled:false}")
    protected static class DefaultWebSecurityConfig {
    }

    @Configuration
    @EnableAutoConfiguration
    @EnableWebMvcSecurity
    @Profile("local")
    @ConditionalOnExpression("${my.security.enabled:false}")
    protected static class LocalWebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/", "/home").permitAll()
                    .anyRequest().authenticated();
            http
                .formLogin().loginPage("/login").permitAll().and()
                .logout().permitAll();
        }

        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth
                .inMemoryAuthentication()
                    .withUser("user").password("password").roles("USER");
        }
    }

}

在上面的类中,我基本上从类顺序中删除,以有条件地使用它。创建了两个配置类,它们通过使用 Boot 的标志进行选择。@EnableAutoConfigurationApplicationDefaultWebSecurityConfigLocalWebSecurityConfigmy.security.enabled@ConditionalOnExpression

第一个配置只是排除,如果我的安全性未启用。第二个启用了安全性并使用配置文件。通过使用不同的配置文件创建另一个配置,您可以控制不同配置文件发生的情况。然后,您可以选择是否启用了安全性以及使用哪个配置文件:SecurityAutoConfigurationlocal

#java -jar build/libs/gs-securing-web-0.1.0.jar
#java -jar build/libs/gs-securing-web-0.1.0.jar --spring.profiles.active=local --my.security.enabled=true

如果可以选择使用 application.yml,则可以为每个配置文件自动应用不同的设置,同时定义默认值。如果您只想禁用默认安全自动配置启用的默认基本身份验证,这将很好。

security:
    basic:
        enabled: false
---
spring:
    profiles: local
security:
    basic:
        enabled: true
---

可能有一百万种不同的方法来做到这一点,并且总是根据具体情况最适合当前的用例。


推荐