如何禁用 spring-security 登录屏幕?

Posted

技术标签:

【中文标题】如何禁用 spring-security 登录屏幕?【英文标题】:How to disable spring-security login screen? 【发布时间】:2014-07-01 10:18:05 【问题描述】:

我正在使用spring-boot-starter-security 依赖项,以利用spring-security 附带的几个类。但是由于我想将它集成到现有的vaadin 应用程序中,我只想使用这些类,而不是使用 spring 的默认登录/身份验证屏幕。

如何禁用此屏幕?

我无法通过扩展WebSecurityConfigurerAdapter 作为我的主要入口类已经extends 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 安全功能?

【问题讨论】:

Spring Boot 中的默认安全性是 Basic。您可以通过设置security.basic.enabled=false 来禁用它。这是你要找的吗? 据我所知,可能明天早上试试 很好用。您可以考虑将此添加为答案,以便我接受。 【参考方案1】:

你可以像这样使用基于java的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 

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

如果应用程序自动刷新,则重新启动它。

【讨论】:

我喜欢你的解决方案。谢谢! 据我所知,这个配置并没有改变任何东西。我认为提供自己的配置优先于 spring 配置? 您也可以添加.formLogin().disable() 删除登录屏幕 这实际上适用于当前最新版本的Spring Boot 2.2.1.BUILD-SNAPSHOT 好的,如果我使用上述解决方案,登录页面就消失了。但仍然从 POST 请求中得到 403。有谁知道如何解决这个问题?【参考方案2】:

Spring Boot 中的默认安全性是 Basic。您可以通过设置security.basic.enabled=false 来禁用它。更多关于 here 和 here 的信息。

【讨论】:

这仍然会导致 / 重定向到 /login,并 /login 提供登录表单 这已被弃用。 noobdev 现在有了正确的答案。【参考方案3】:

通过从自动配置中排除默认弹簧安全性来禁用它。将SecurityAutoConfiguration.class 添加到主类上@SpringBootApplication 注释的exclude 属性中。如下:

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

【讨论】:

禁用 Spring Security 是一个糟糕的解决方案。应用程序应该是安全的! OP 请求仅在类路径上提供某些类,而不是启用 spring 安全性。当 Spring Boot 在类路径中找到 jar 时,它会自动启用 Spring 安全性。我的解决方案将确保不会发生这种情况。【参考方案4】:

似乎有一个更简单的解决方案。

只需将此注释放在主类上方或与SpingBootApplication 注释相同的位置

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

【讨论】:

【参考方案5】:

要完全禁用登录路由,请使用 Spring Security 配置对象

下面的sn-p使用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
  

【讨论】:

这个 JAVA 语法什么时候改变了? 这是 Kotlin 语法。【参考方案6】:

在主spring-boot应用类(有@SpringBootApplication注解的类)

@SpringBootApplication(exclude=SecurityAutoConfiguration.class)

【讨论】:

【参考方案7】:

这对我有用

            @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
                
                      

【讨论】:

这从 'org.springframework.boot' 版本 '2.3.4.RELEASE' 开始工作【参考方案8】:

如果有人仍然需要解决方案,请在 REST 控制器中添加一个方法,如下所示:

@RestController
public class myRestController

    @GetMapping("/login")
    public String redirectTo()
        return "yourRedirectLink";
    


这个解决方案非常适合使用 spring 并在罐子中进行反应

【讨论】:

【参考方案9】:

这是为了帮助其他努力删除默认 Spring Boot 登录屏幕并拥有一些安全路径的人。这对我使用 Spring Boot 2.3.4 和 spring-boot-security 启动器和这篇文章:https://www.toptal.com/spring/spring-security-tutorial 帮助了我。此配置允许对 /api/config-props 和 /actuator/health 进行 GET,但需要在任何其他执行器路径或任何其他 api 路径上进行身份验证。然后最后允许 GET 获取可能在 /resources 或 /public 等中提供静态内容的任何其他位。

  @Override
  protected void configure(HttpSecurity security) throws Exception 
    // Enable CORS and disable CSRF
    security = security.cors().and().csrf().disable();

    // Set session management to stateless
    security = security
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and();

    // Set permissions on endpoints
    security.authorizeRequests()
            // Our public endpoints, secured endpoints and then open everything else that is static resource stuff
            .antMatchers(HttpMethod.GET, "/api/config-props").permitAll()
            .antMatchers(HttpMethod.GET, "/actuator/health").permitAll()
            .antMatchers("/actuator**").authenticated()
            .antMatchers("/api/**").authenticated()
            .antMatchers(HttpMethod.GET, "/**").permitAll();
  

【讨论】:

以上是关于如何禁用 spring-security 登录屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用 Spring Security 的登录屏幕? [复制]

如何在 iOS 11 应用程序登录屏幕中禁用新密码自动填充功能?

spring-security 如何使用用户名或邮箱登录

如何在flutter中登录后禁用用户返回

如何使用spring-security通过用户名和密码登录?

如何使用 Spring-security 以编程方式登录用户?