Grails Redirect Post-Logout Использование spring-security-core-3.0.6 + - PullRequest
5 голосов
/ 17 октября 2011

В весенней версии безопасности 3.0.6, в которой исправлен эксплойт выхода из CRLF (https://jira.springsource.org/browse/SEC-1790) они отключили использование параметра 'spring-security-redirect'.

Поддержка по умолчанию для параметра перенаправления в URL-адресах выхода также был удален в 3.0.6. В 3.1 его уже нужно включить явно.

Есть ли способ снова включить параметр перенаправления, чтобы я мог динамически перенаправлять в моем контроллере выхода из системы безопасности Grails Spring?

LogoutContoller.groovy

def user = springSecurityService.currentUser

if (params.redirect) {
    // this needs to log the user out and then redirect, so don't redirect until we log the user out here
    log.info "Redirecting " + springSecurityService.currentUser.username + " to " + params.redirect
    // the successHandler.targetUrlParameter is spring-security-redirect, which should redirect after successfully logging the user out
    redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl + "?spring-security-redirect="+params.redirect
    return;
}


redirect uri: SpringSecurityUtils.securityConfig.logout.filterProcessesUrl // '/j_spring_security_logout'

Следующее больше не работает для версий Spring Security 3.0.6 +

Ответы [ 2 ]

15 голосов
/ 22 марта 2012

Вы можете выйти из системы программно и выполнить ручное перенаправление в действии контроллера:

// Bean where Spring Security store logout handlers
def logoutHandlers
// logout action
def logout = {
    // Logout programmatically
        Authentication auth = SecurityContextHolder.context.authentication
    if (auth) {
        logoutHandlers.each  { handler->
            handler.logout(request,response,auth)
        }
    }
    redirect uri:params.redirect
}
1 голос
/ 27 октября 2011

Это довольно специализированная тема, вот исследуемое решение:

Вот коммит 3.0.x, который удалил перенаправление: http://git.springsource.org/spring-security/spring-security/commit/a087e828a63edf0932e4eecf174cf816cbe6a58a

Основная идея состоит в том, что они удалили возможность для компонента по умолчанию LogoutSuccessHandler обрабатывать перенаправления, удалив targetUrlParameter (установка его в значение null не вызывает перенаправлений).

Таким образом, решение проблемы заключается в 1) Создайте простой компонент LogoutSuccessHandler, который не устанавливает для targetUrlParameter значение null:

/**
 * Handles the navigation on logout by delegating to the {@link AbstractAuthenticationTargetUrlRequestHandler}
 * base class logic.
 */
public class RedirectLogoutSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler
        implements LogoutSuccessHandler {

    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        super.handle(request, response, authentication);
    }

}

И 2) Зарегистрируйте этот компонент в resources.groovy:

 logoutSuccessHandler(com.example.package.RedirectLogoutSuccessHandler)

И поведение по умолчанию - разрешить перенаправления выхода из системы.

...