Переписать URL-адреса перенаправления spring-security

Я пытаюсь заставить Tuckey UrlRewriteFilter убирать URL-адреса для моего веб-приложения. Одна проблема, с которой я столкнулся, заключается в том, что когда spring-security замечает, что анонимный пользователь пытается получить доступ к защищенному ресурсу, он перенаправляется на 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. Могу ли я убедить Таки переписать заголовок 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>

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>

person ptomli    schedule 19.11.2009    source источник
comment
и установить для атрибута страницы входа значение /login?   -  person rodrigoap    schedule 20.11.2009


Ответы (4)


Я изучал эту проблему для нашего проекта в прошлом году, и в то время проблема заключалась в том, что Tucky не сотрудничал с response.encodeRedirectUrl() для перезаписи URL-адресов перенаправления. Я связался с ними, но я не следил за этим.

Мое решение состояло в том, чтобы позволить грязному URL-адресу вернуться к клиенту, но затем очистить его с помощью правила перенаправления Tucky (второе перенаправление).

Поэтому добавьте еще одно правило, которое соответствует вашему уродливому URL-адресу из перенаправления безопасности, и создайте собственное перенаправление на чистый URL-адрес:

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

Да, это включает в себя два перенаправления, но клиент никогда его не увидит... в этом, наверное, и дело.

person Pat Niemeyer    schedule 15.12.2009

Безопасность Spring выполняет перенаправление с абсолютным URL-адресом, например http://example.org/-/login

Попробуйте использовать исходящее правило без маркера ^ start of string, чтобы оно соответствовало абсолютному URL-адресу, сгенерированному spring.

<outbound-rule>
    <from>/-/login(.*)$</from>
    <to>/login$1</to>
</outbound-rule>    
person Serxipc    schedule 15.12.2009

Я столкнулся с той же проблемой, но, кажется, она исправлена ​​в версии 3.2.0 Tuckey. т. е. response.encodeRedirectUrl() теперь обернут Tuckeys UrlRewriteWrappedResponse, где происходит выполнение исходящего правила.

person Bas    schedule 05.01.2010

Я никогда не использовал Tuckey, но после быстрого просмотра документации я бы попробовал добавить одно правило для случая входа в систему:

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

EDIT
Хорошо, и что-то вроде этого:

<urlrewrite>
    <rule>
        <from>^/-/login$</from>
        <to>/login</to>
    </rule>
    <rule>
        <from>^/(.*)$</from>
        <to>/-/$1</to>
    </rule>
</urlrewrite>
person rodrigoap    schedule 19.11.2009
comment
Проблема не в том, что входящие запросы не перезаписываются, а в том, что исходящие заголовки Location как часть перенаправления не перезаписываются. С тех пор я понял, что исходящее правило с полным протоколом, хостом, портом, контекстом и т. д. будет перехватывать заголовок Location, но это тоже не очень хорошо. - person ptomli; 20.11.2009