Spring Security 之 StrictHttpFirewall 坑

这个防火墙有个坑啊 啊 啊。。。。。

事情原由:项目初次引入security为swagger相关页面做验证

异常:org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.

 

解决:

解决方法:(注意方法下方趟过的撸)

1.强制自定义防火墙

    @Bean
    public HttpFirewall defaultHttpFirewall() {
        return new DefaultHttpFirewall();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        //新防火墙强制覆盖原来的
        web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
        //super.configure(web);
    }

2.修改swagger源码,修复//的bug

3.网上查到的方法(我自己测试无法使用这种方法)

    @Bean
    public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
        StrictHttpFirewall firewall = new StrictHttpFirewall();
        //此处开启不让检测‘/’符号
        firewall.setAllowUrlEncodedSlash(true);
        return firewall;
    }
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
        //super.configure(web);
    }

趟过的路:

方法一:使用方法已通过的确实可以避开“//”,但是跟过源码

Spring Security 之 StrictHttpFirewall 坑_第1张图片

改源码使用的uri是String类型,这个if即使含“//”也会返回false(即有效的url),感觉这个方法没啥用

方法二:正常没毛病,可用、

方法三:最坑Spring Security 之 StrictHttpFirewall 坑_第2张图片

使用该方法,途中校验1可以通过,但是校验2中isNormalized(request)的检验"//"是写死的啊

Spring Security 之 StrictHttpFirewall 坑_第3张图片

ε=(´ο`*)))唉,最靠谱的方法二需要体力ε=ε=ε=(#>д<)ノ

各位路过的,如果有指正请及时赐教,挽救我于无尽苦海

 

你可能感兴趣的:(#)