屏蔽spring security的默认登录页

屏蔽spring security的默认登录页_第1张图片 Spring Security默认登录页

大家在使用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()).and()
      .logout();
   // @formatter:on
   ClassLoader classLoader = this.context.getClassLoader();
   List 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); //将默认加载的登录页配置删除
            }
        };
    }

 经过测试,这种方式可行。

 

 

 

你可能感兴趣的:(笔记,经验分享,java,spring,web,安全)