【问题标题】:Spring-security cannot match "?parameter" format?Spring-security 不能匹配“?参数”格式?
【发布时间】:2012-05-06 03:51:30
【问题描述】:

我使用 spring-security 来保护我的 web,当我通过 spring-roo 在 applicationContext-security.xml 中生成的配置文件学习它时,<http> 节点:

 <intercept-url pattern="/userses?form" access="hasRole('ROLE_ADMIN')" />

这意味着当你想创建一个Users对象时,首先你需要登录以获得ADMIN权限。但实际上并没有奏效。查看日志:

2012-05-06 11:39:11,250 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/userses'; against '/userses?form'

框架使用 /userses 而不是 /userses?form 进行比较,由于字符串不匹配而跳过身份验证过程。为了验证这一点,我还尝试了另一个网址:

<intercept-url pattern="/userses/abc" access="hasRole('ROLE_ADMIN')" />

我请求了 /userses/abc,它检测到用户没有被授权,并移动到 /login 页面,检查日志:

2012-05-06 11:46:44,343 [http-8088-7] DEBUG org.springframework.security.web.util.AntPathRequestMatcher - Checking match of request : '/uesrses/abc'; against '/userses/abc'

所以我的问题是:spring-secure 3 不支持“?参数”模式还是我错过了一些配置来支持这一点? PS:所有代码都是roo生成的,没有修改,也奇怪为什么不行。

【问题讨论】:

    标签: spring spring-security spring-roo


    【解决方案1】:

    默认spring security使用ant风格匹配,无法匹配参数。然而,正则表达式匹配可以匹配参数

    尝试像这样定义它:

    <http request-matcher="regex">
      <security:intercept-url pattern="\A/userses\?form.*\Z" access="hasRole('ROLE_ADMIN')" />
    </http>
    

    不知道为什么 Roo 不自动执行此操作。好像应该这样。

    【讨论】:

    • @JerryCai 也许你应该提出一个新问题。阅读 cmets 中的代码很困难,如果他们能在 SO 上找到它作为一个不同的问题,它将帮助解决相同问题的其他人。
    【解决方案2】:

    该行为由正在使用的"request-matcher" 定义。如文档所示,默认值为“ant”,表示使用AntPathRequestMatcher,另一种选择是“regex”,即RegexRequestMatcher。 javadocs (linked) 给出了有关匹配器的详细信息,包括前者与请求的“servletPath + pathInfo”匹配,后者与其“servletPath + pathInfo + queryString”匹配。

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 2015-12-31
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 2012-10-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多