重写spring-security重定向URL

时间:2009-11-19 10:50:23

标签: java spring-mvc url-rewriting spring-security tuckey-urlrewrite-filter

我正在尝试让Tuckey UrlRewriteFilter为我的webapp整理网址。我遇到的一个问题是,当spring-security注意到匿名用户试图访问受保护资源时,它会重定向到包含servlet路径的URL。

我想要的是,例如:

> GET http://localhost:8080/my-context/protected-resource
< Location: http://localhost:8080/my-context/login

我目前得到的是:

> GET http://localhost:8080/my-context/protected-resource
< Location: http://localhost:8080/my-context/-/login

到目前为止我找到的相关文件:

DefaultRedirectStrategy,用于执行相关的实际重定向:http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/DefaultRedirectStrategy.html。它有一个很有诱惑力的contextRelative属性,但如果我能找到配置它的方法,我认为不会削减它。

一篇帮助我了解这一点的博文:http://nonrepeatable.blogspot.com/2009/11/using-spring-security-with-tuckey.html

我想知道的是:

  1. 可以/应该说服Tuckey重写Location标头。 &LT;出站规则&GT;在这里似乎没什么帮助。
  2. 可以/我应该以某种方式调整SS配置以发出重写的URL。我认为这不是很整洁,因为如果禁用重写就会中断。
  3. web.xml看起来像

    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
        <init-param>
            <param-name>LogLevel</param-name>
            <param-value>log4j</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>UrlRewriteFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    
    <servlet>
        <servlet-name>my-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>psms</servlet-name>
        <url-pattern>/-/*</url-pattern>
    </servlet-mapping>
    

    urlrewrite.xml看起来像:

    <urlrewrite>
        <rule>
            <from>^/(.*)$</from>
            <to>/-/$1</to>
        </rule>
    </urlrewrite>
    

    applicationContent-security.xml看起来像:

    <http auto-config="true">
        <!-- allow GET requests to /login without authentication -->
        <intercept-url pattern="/-/login" method="GET" filters="none"/>
    
        <intercept-url pattern="/-/admin/**" access="ROLE_ADMIN"/>
        <intercept-url pattern="/-/**" access="ROLE_USER"/>
    
        <form-login login-page="/-/login"
                    login-processing-url="/-/login.do"
                    authentication-failure-url="/-/login?login_error"
                    default-target-url="/-/index"
                    always-use-default-target="true"/>
    
        <logout logout-url="/-/logout"
                logout-success-url="/-/login"/>
    
        <access-denied-handler error-page="/-/access-denied"/>
    </http>
    

4 个答案:

答案 0 :(得分:2)

去年我为我们的项目研究了这个问题,当时问题是Tucky没有与response.encodeRedirectUrl()合作重写重定向URL。我联系了他们,但我没有跟进。

我的解决方案是让凌乱的网址返回客户端,然后使用Tucky重定向规则(第二次重定向)清理它。

因此,添加另一条与安全重定向中的丑陋URL匹配的规则,并将您自己的重定向发送到干净的URL:

<rule>
    <from>^/whatever/ugly.*$</from>
    <to type="redirect">/login</to>
</rule>

是的,它涉及两个重定向,但客户端永远不会看到它......这可能就是重点。

答案 1 :(得分:1)

Spring安全性正在使用像http://example.org/-/login

这样的绝对URL进行重定向

尝试使用不带^ start of string标记的出站规则来匹配spring生成的绝对网址。

<outbound-rule>
    <from>/-/login(.*)$</from>
    <to>/login$1</to>
</outbound-rule>    

答案 2 :(得分:1)

我遇到了同样的问题,但似乎修复了Tuckey的3.2.0版本。 即,响应.encodeRedirectUrl()现在由Tuckeys UrlRewriteWrappedResponse包装,其中执行出站规则。

答案 3 :(得分:0)

我从未使用过Tuckey,但在快速查看文档之后,我会尝试为登录案例添加一条规则:

<urlrewrite>
    <rule>
        <from>^/my-context/login$</from>
        <to>/my-context/login</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>

修改
好的,等等:

<urlrewrite>
    <rule>
        <from>^/-/login$</from>
        <to>/login</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>