如何禁用 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 应用程序登录屏幕中禁用新密码自动填充功能?