
大家在使用spring security时会默认带入一个登录页,而这个登录页大家往往都是不想要的,今天通过调试代码跟踪了对内部DefaultLoginPageConfigurer的各种配置后发现,不好使!!!
开始的时候用了url覆盖的方式,即添加一个匹配/login的controller,但是采用这种方式会造成正常的登录请求无法访问。
@Controller
public class LoginPage {
@GetMapping("/login")
public void loginPage(HttpServletRequest request, HttpServletResponse response){
String contextPath = request.getContextPath();
response.addHeader("Location",contextPath + "/#/myLogin");
response.setStatus(302);
}
}
经过进一步对源码的分析,发现默认登录页是由org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter这个filter返回的,而这个类的实例化是在org.springframework.security.config.annotation.web.configurers.DefaultLoginPageConfigurer中实现的,再进一步分析发下这个是在org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter中被默认加载的。
http = new HttpSecurity(objectPostProcessor, authenticationBuilder,
sharedObjects);
if (!disableDefaults) {
// @formatter:off
http
.csrf().and()
.addFilter(new WebAsyncManagerIntegrationFilter())
.exceptionHandling().and()
.headers().and()
.sessionManagement().and()
.securityContext().and()
.requestCache().and()
.anonymous().and()
.servletApi().and()
.apply(new DefaultLoginPageConfigurer<HttpSecurity>()).and()
.logout();
// @formatter:on
ClassLoader classLoader = this.context.getClassLoader();
List<AbstractHttpConfigurer> defaultHttpConfigurers =
SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);
for(AbstractHttpConfigurer configurer : defaultHttpConfigurers) {
http.apply(configurer);
}
}
既然找到了这里那么解决问题就有思路了,既然这里默认进行了加载,那么我再将它移除不就行了,于是就尝试用下边的方法解决该问题:
@Bean
public WebSecurityConfigurerAdapter loginPageConfig(){
return new WebSecurityConfigurerAdapter() {
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.removeConfigurer(DefaultLoginPageConfigurer.class); //将默认加载的登录页配置删除
}
};
}
经过测试,这种方式可行。

本文介绍了如何在使用Spring Security时禁用其自带的默认登录页面。通过分析源码,发现默认登录页由DefaultLoginPageGeneratingFilter过滤器创建,该过滤器在WebSecurityConfigurerAdapter中自动加载。解决方案是通过配置移除这个加载,经测试,该方法有效。
9078





