屏蔽spring security的默认登录页

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

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

 

 

 

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineZhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值