重写spring-security重定向URL

pto*_*mli 6 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
Run Code Online (Sandbox Code Playgroud)

我目前得到的是:

> GET http://localhost:8080/my-context/protected-resource
< Location: http://localhost:8080/my-context/-/login
Run Code Online (Sandbox Code Playgroud)

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

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标头.<outbound-rule>似乎对此没有任何帮助.
  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>
Run Code Online (Sandbox Code Playgroud)

urlrewrite.xml 好像:

<urlrewrite>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

rod*_*oap 0

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

<urlrewrite>
    <rule>
        <from>^/my-context/login$</from>
        <to>/my-context/login</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>
Run Code Online (Sandbox Code Playgroud)

编辑
好的,像这样的:

<urlrewrite>
    <rule>
        <from>^/-/login$</from>
        <to>/login</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>
Run Code Online (Sandbox Code Playgroud)

  • 问题不在于入站请求不会被重写,而是出站 Location 标头作为重定向的一部分不会被重写。此后我发现,具有完整协议、主机、端口、上下文等的出站规则将捕获位置标头,但这也不是很好。 (2认同)