изменение весеннего параметра безопасности logout-success-url - PullRequest
5 голосов
/ 17 февраля 2011

Мне нужно перенаправить пользователя на 2 разных URL выхода из системы в зависимости от его роли. Как мне это сделать?

Я использую Spring Security 2.0 , и мой XML выглядит примерно так:

    <s:http access-denied-page="/" >
        <s:intercept-url pattern="/pages/SplashPage.jsf" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
        <s:intercept-url pattern="/pages/Home.jsf" access="ROLE_USER,ROLE_MERCHANT"/>

        <s:anonymous/>
        <s:form-login
            login-page="/"
            login-processing-url="/j_spring_security_check"
            default-target-url="/pages/Home.jsf"
            authentication-failure-url="/" always-use-default-target='false' />
        <s:logout invalidate-session="true" logout-url="/pages/logout.jsf" logout-success-url="/" />
        <s:concurrent-session-control max-sessions="1" exception-if-maximum-exceeded="false"/>
    </s:http>

Ответы [ 2 ]

2 голосов
/ 19 февраля 2011

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

  1. не invalidate-session
  2. изменить logout-success-url на специальный контроллер перенаправления
  3. в этом контроллере потяните сеанс пользователя, чтобы сообщить пользователю тип
  4. сделать сеанс недействительным
  5. перенаправить на правильный URL для типа пользователя
0 голосов
/ 18 февраля 2011

EDIT - обновлено до решения Spring Security 2.0.

Замените LogoutFilter на ваш подкласс, переопределения doFilterHttp:

public void doFilterHttp(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException,
        ServletException {

    if (requiresLogout(request, response)) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

        if (logger.isDebugEnabled()) {
            logger.debug("Logging out user '" + auth + "' and redirecting to logout page");
        }

        for (int i = 0; i < handlers.length; i++) {
            handlers[i].logout(request, response, auth);
        }

        // Do role-specific logic here to determine targetUrl

        sendRedirect(request, response, targetUrl);

        return;
    }

    chain.doFilter(request, response);
}

Замените LogoutFilter следующим образом:

<beans:bean id="myLogoutFilter" class="com.mycompany.MyLogoutFilter">
  <custom-filter position="LOGOUT_FILTER"/>
</beans:bean>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...