UrlEncodedSlash 被 HttpFirewall 阻止(Grails 3.3.0.RC1;Spring-security-core 3.2.0.M1)
UrlEncodedSlash blocked by HttpFirewall (Grails 3.3.0.RC1; Spring-security-core 3.2.0.M1)
我在我的日志中发现了这个错误:
org.springframework.security.web.firewall.RequestRejectedException: The requestURI cannot contain encoded slash. Got /;lm=1488887514;m=js;asset=delayedElements%2Fsnippet;tf;ucm=353df4434086482d9d1d7b89758e156e/
at org.springframework.security.web.firewall.DefaultHttpFirewall.getFirewalledRequest(DefaultHttpFirewall.java:56)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:193)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
...
我发现这个解决方案可能适用于 Spring Boot。
我能否以及如何在 Grails 中应用它?
提前致谢!
编辑 1:
我就是这样实施 Sudhir 的建议的:
这里我创建了新的class:
这是实现的样子:
package fnx.security;
import org.springframework.security.web.firewall.DefaultHttpFirewall;
public class CustomHttpFirewall extends DefaultHttpFirewall {
CustomHttpFirewall() {
boolean allowUrlEncodedSlash = true;
}
}
这就是它包含在 application.yml 中的方式:
grails:
plugin:
springsecurity:
httpFirewallBeanClass: 'fnx.security.CustomHttpFirewall'
有什么遗漏或错误吗?
默认情况下 spring 安全核心插件使用 DefaultHttpFirewall
您可以通过扩展 DefaultHttpFirewall
创建子 class 并设置 属性 allowUrlEncodedSlash
从构造函数变为真。
CustomHttpFirewall extends DefaultHttpFirewall {
CustomHttpFirewall() {
allowUrlEncodedSlash = true
}
}
然后配置 spring 安全性以使用您的自定义防火墙 class,如下所示。
grails.plugin.springsecurity.httpFirewallBeanClass = "full name of your class"
注意测试,但这应该有效。
我在我的日志中发现了这个错误:
org.springframework.security.web.firewall.RequestRejectedException: The requestURI cannot contain encoded slash. Got /;lm=1488887514;m=js;asset=delayedElements%2Fsnippet;tf;ucm=353df4434086482d9d1d7b89758e156e/
at org.springframework.security.web.firewall.DefaultHttpFirewall.getFirewalledRequest(DefaultHttpFirewall.java:56)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:193)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
...
我发现这个解决方案可能适用于 Spring Boot。
我能否以及如何在 Grails 中应用它? 提前致谢!
编辑 1:
我就是这样实施 Sudhir 的建议的:
这里我创建了新的class:
这是实现的样子:
package fnx.security;
import org.springframework.security.web.firewall.DefaultHttpFirewall;
public class CustomHttpFirewall extends DefaultHttpFirewall {
CustomHttpFirewall() {
boolean allowUrlEncodedSlash = true;
}
}
这就是它包含在 application.yml 中的方式:
grails:
plugin:
springsecurity:
httpFirewallBeanClass: 'fnx.security.CustomHttpFirewall'
有什么遗漏或错误吗?
默认情况下 spring 安全核心插件使用 DefaultHttpFirewall
您可以通过扩展 DefaultHttpFirewall
创建子 class 并设置 属性 allowUrlEncodedSlash
从构造函数变为真。
CustomHttpFirewall extends DefaultHttpFirewall {
CustomHttpFirewall() {
allowUrlEncodedSlash = true
}
}
然后配置 spring 安全性以使用您的自定义防火墙 class,如下所示。
grails.plugin.springsecurity.httpFirewallBeanClass = "full name of your class"
注意测试,但这应该有效。