6

我试图让Tuckey UrlRewriteFilter为我的webapp整理网址。我得到的一个问题是,当spring-security发现匿名用户试图访问受保护资源时,它会重定向到一个包含servlet路径的URL。重写弹簧安全重定向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头。 <出站规则>在这里似乎没有帮助。
  2. 可以/我应该以某种方式调整SS配置以发出重写的URL。我认为这不是很整洁,因为如果重写被禁用,它会中断。

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> 
+0

并将登录页面属性设置为/ login? – rodrigoap 2009-11-20 15:33:37

回答

0

心中已经没用过Tuckey,但经过快看在文件中entation我会尝试添加一个规则来进行登录的情况下:

<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> 
+2

问题不在于入站请求不会被重写,而不是出站位置标头作为重定向的一部分不会被重写。 我从那以后就研究出一个带有完整协议,主机,端口,上下文等的出站规则将会捕获位置标题,但这也不是很好。 – ptomli 2009-11-20 06:54:53

2

我研究过这个问题,去年我们的项目,并在那个时候问题在于Tucky没有与response.encodeRedirectUrl()合作来重写重定向URL。我联系了他们,但我没有跟进。

我的解决方案是让混乱的URL返回到客户端,但随后使用Tucky重定向规则(第二个重定向)清理它。

所以再添你的丑陋的网址从安全重定向规则相匹配,并发出自己的重定向到URL清洁:

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

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

1

春季安全与绝对URL做重定向像http://example.org/-/login

尝试使用出站规则,而不^ start of string标记以匹配弹簧产生的绝对URL。

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

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