【问题标题】:Allowing query strings in RegexRequestMatcher在 RegexRequestMatcher 中允许查询字符串
【发布时间】:2015-02-06 18:31:31
【问题描述】:

我正在尝试添加一个 RegexRequestMatcher,它将查找具有特定 url 参数的 url,并将请求重定向到自定义 AuthenticationEntryPoint。但是,我很难匹配 url 参数,因为它们似乎已从传入的 HttpServletRequest 中删除。经过一些重要的搜索之后,听起来 Spring Security 出于安全原因故意将这些从传入的请求中过滤掉。

似乎有一个属性 stripQueryStringFromUrls 覆盖了可以通过 DefaultFilterInvocationSecurityMetadataSource 类上的 BeanPostProcessor 设置的此行为,但是从 3.1 开始,此属性不再存在(在 3.0.0 中,它似乎在消失之前已移至 FilterChainProxy完全与下一个版本)。

默认情况下,spring security 是否仍会删除查询字符串,或者配置属性的消失是否是该行为被删除的结果?如果仍然如此,您如何从 spring security 3.1 启用 url 参数?

我通过 grails spring security 插件 (1.2.7) 使用 Spring Security 3.1.3。

【问题讨论】:

    标签: java grails spring-security


    【解决方案1】:

    在 spring security web 的 3.0 和 3.1 版本之间确实删除了 stripQueryStringFromUrls。整个功能都被删除了,取而代之的是 RequestMatcher 对象被用来处理必要的请求转换。这可以在 DefaultFilterInvocationSecurityMetadataSource 类的以下提交差异中验证 commit diff of the class DefaultFilterInvocationSecurityMetadataSource.

    相反,框架已更改,因此使用 AntPathRequestMatcher 将导致查询字符串被忽略,而使用 RegexRequestMatcher 将考虑它(使用自定义 RequestMatcher 即可无论你选择让它做什么。

    因此,上述实现应该有效。事实证明,实际问题(在问题中并不明显)是用于测试弹簧安全性的 url 本身。 url 的正确顺序是

    [url base] + [query params] + [page fragment] 例如localhost/something?param=whatever#/blah

    但我试图这样订购它

    [url base] + [page fragment] + [query params] 例如localhost/something#/blah?param=whatever

    这导致查询参数与页面片段一起丢失。当以正确的顺序完成时,spring security 会正确接收并相应地解析请求。

    【讨论】:

      猜你喜欢
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多