如何禁用Spring Security登录界面?

63
我正在使用 spring-boot-starter-security 依赖项,以便利用带有 spring-security 的多个类。但是,我想将其集成到现有的 vaadin 应用程序中,我只想使用这些类,而不是使用 spring 的默认登录/认证屏幕。
如何禁用此屏幕?
我无法通过扩展 WebSecurityConfigurerAdapter 进行任何配置,因为我的主要入口类已经扩展了 SpringBootServletInitializer。此外,vaadin 应用程序基本上一直在同一URL路径上运行,并使用内部导航。
@EnableAutoConfiguration
public class MyApp extends SpringBootServletInitializer { 

        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
            return application.sources(MyApp.class);
        }

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

那么,我该如何禁用登录界面,但仍然利用Spring Security功能呢?

18个回答

105

您可以像这样使用基于Java的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity security) throws Exception
    {
     security.httpBasic().disable();
    }
}

如果您的应用程序自动刷新,请重新启动应用程序。


我喜欢你的解决方案。谢谢! - Dosi Bingov
1
据我所知,这个配置不会改变任何东西。我认为提供自己的配置应该比Spring配置优先。 - peekay
16
您可以添加.formLogin().disable()来移除登录界面。 - Guillaume F.
1
好的,如果我使用上面的解决方案,登录页面会消失。但是仍然会收到POST请求的403错误。有人知道如何解决吗? - user771
1
在版本5.7.0-M2中,WebSecurityConfigurerAdapter的使用已被弃用。现在应该通过注册SecurityFilterChain组件来完成。 - alexdefelipe
显示剩余2条评论

35

Spring Boot的默认安全性为基本认证(Basic)。您可以通过设置security.basic.enabled=false来禁用它。关于此的更多信息,请参见此处此处


13
仍会导致 / 重定向到 /login,而 /login 则提供登录表单。 - OrangeDog
25
这已经被弃用了。现在,noobdev提供了正确的答案。 - Krum
2
2023年无法工作。 - horvoje

19

通过将其从自动配置中排除来禁用默认的Spring Security。在主类的@SpringBootApplication注释的exclude属性中添加SecurityAutoConfiguration.class。如下所示:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2
禁用Spring Security是一个不好的解决方案。应用程序应该是安全的! - Amir Kost
OP请求仅在类路径上可用某些类,而不是启用Spring安全性。当Spring Boot在类路径上找到这些jar包时,它会自动启用Spring安全性。我的解决方案将确保这种情况不会发生。 - Michiel Haisma

12

在主Spring Boot应用程序类中(具有@SpringBootApplication注释的类)

@SpringBootApplication(exclude={SecurityAutoConfiguration.class})

6
您可以在Spring Boot(3.0.0-m4)和响应式模型(WebFlux)的新版本中使用此代码。
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
   @Bean
    public SecurityWebFilterChain filterChain(ServerHttpSecurity http) {
    return http
            .httpBasic().disable()
            .build();
}
}

1
在Spring Boot 3中,你可以使用http.httpBasic(AbstractHttpConfigurer::disable).build();来实现。 - Saleem gagguturu

6

看起来有一个更简单的解决方案。

只需在您的主类或与您的SpingBootApplication注释相同的位置放置此注释即可:

@EnableAutoConfiguration(exclude = {org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class})


4

这个方法对我有效

            @Configuration
            @EnableWebSecurity
            public class SecurityConfig extends WebSecurityConfigurerAdapter {
                @Override
                protected void configure(HttpSecurity security) throws Exception
                {
                 //security.httpBasic().disable(); // Did work only for GET     
                 security.csrf().disable().authorizeRequests().anyRequest().permitAll(); // Works for GET, POST, PUT, DELETE
                }
            }          

2
这个在 'org.springframework.boot' 版本 '2.3.4.RELEASE' 中是可行的。 - Randy

4
要完全禁用登录路由,请使用Spring Security配置对象。
以下代码片段使用org.springframework.boot:2.1.6.RELEASE
@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter() {
  override fun configure(security: HttpSecurity) {
    super.configure(security)

    security.httpBasic().disable()

    security.cors().and().csrf().disable().authorizeRequests()
      .anyRequest().authenticated()
      .and().formLogin().disable() // <-- this will disable the login route
      .addFilter(JWTAuthorizationFilter(authenticationManager()))
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
  }

  @Bean
  fun corsConfigurationSource(): CorsConfigurationSource {
    val source = UrlBasedCorsConfigurationSource()
    val config = CorsConfiguration().applyPermitDefaultValues()
    config.addExposedHeader("Authorization")
    source.registerCorsConfiguration("/**", config)
    return source
  }
}

2
这个JAVA语法什么时候改变的? - Ashutosh Agrawal
这是 Kotlin 语法。 - Amarnath Reddy Dornala
1
这不是Java。你为什么要在这里推它? - horvoje
因为无论是Java还是Kotlin,配置都是相同的。 - undefined

2

我正在使用Spring-Boot v3

正如Spring官方博客所说:

在Spring Security 5.7.0-M2中,WebSecurityConfigurerAdapter已被弃用。

推荐使用SecurityFilterChain,所以我创建了一个配置类:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http.authorizeHttpRequests((auth) -> auth.anyRequest().permitAll()).build();
    }

}

1
请注意,最近的Spring版本中已弃用WebSecurityConfigurerAdapter的使用,而应根据Spring文档使用SecurityFilterChain。https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter。下面是相应的代码。
    @Configuration
    public class SecurityConfiguration {
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            http
                .authorizeHttpRequests((authz) -> authz
                    .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
            return http.build();
        }
    
        @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring().requestMatchers("/*");
    }
    }

在RequestMatchers中,我已经允许了所有不需要Spring Security的端点,而你可以指定仅需要在没有Spring Security的情况下公开的端点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接