我正在尝试添加一个RegexRequestMatcher,它将查找具有特定url参数的URL并将请求重定向到自定义AuthenticationEntryPoint。但是,我很难匹配url参数,因为它们似乎从传入的HttpServletRequest中删除了。在进行了一些重要的搜索之后,听起来像是出于安全原因故意将Spring这些从传入的请求中过滤出来。
似乎有一个属性stripQueryStringFromUrls覆盖了这种行为,可以通过DefaultFilterInvocationSecurityMetadataSource类上的BeanPostProcessor设置,但是从3.1开始这个属性不再存在(在3.0.0中它似乎已经移动到FilterChainProxy消失之前完全与下一个版本)。
Spring安全性是否仍会默认删除查询字符串,或者配置属性是否因删除该行为而消失?如果仍然如此,那么如何在弹簧安全3.1中启用url参数?
我通过grails spring安全插件(1.2.7)使用Spring Security 3.1.3。
答案 0 :(得分:0)
stripQueryStringFromUrls确实被删除了弹簧安全网的3.0和3.1版本之间。取出整个功能,然后根据需要使RequestMatcher对象处理请求转换。这可以在类DefaultFilterInvocationSecurityMetadataSource的以下提交diff中验证 commit diff of the class DefaultFilterInvocationSecurityMetadataSource
相反,框架已更改,因此使用 AntPathRequestMatcher 将导致查询字符串被忽略,而使用 RegexRequestMatcher 将考虑它(并使用自定义RequestMatcher将执行无论你选择做什么。
因此,上述实施应该有效。事实证明,实际问题(在问题中并不明显)是用于测试弹簧安全性的url本身。网址的正确顺序是
[url base] + [query params] + [page fragment]例如本地主机/东西?PARAM =任何#/嗒嗒
但我试图按此命令
[url base] + [页面片段] + [查询参数],例如本地主机/东西#/嗒嗒?PARAM =任何
导致查询参数与页面片段一起丢失。以正确的顺序完成后,spring security会相应地正确接收和解析请求。