From 3ee9f011a6db0a2d81528a42f5f1ebe4d0876ae6 Mon Sep 17 00:00:00 2001 From: Julian Hochstetter <julian.hochstetter@mni.thm.de> Date: Fri, 14 Sep 2012 10:01:36 +0200 Subject: [PATCH] Task #3862: CasLogoutSuccessHandler append referer to logout url, the user gets back to the right arsnova --- .../thm/arsnova/CASLogoutSuccessHandler.java | 47 +++++++++++++++++++ .../java/de/thm/arsnova/LoginController.java | 1 + .../webapp/WEB-INF/spring/spring-security.xml | 15 +++--- 3 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 src/main/java/de/thm/arsnova/CASLogoutSuccessHandler.java diff --git a/src/main/java/de/thm/arsnova/CASLogoutSuccessHandler.java b/src/main/java/de/thm/arsnova/CASLogoutSuccessHandler.java new file mode 100644 index 00000000..e173c8ea --- /dev/null +++ b/src/main/java/de/thm/arsnova/CASLogoutSuccessHandler.java @@ -0,0 +1,47 @@ +package de.thm.arsnova; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.DefaultRedirectStrategy; +import org.springframework.security.web.RedirectStrategy; +import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; + +public class CASLogoutSuccessHandler implements LogoutSuccessHandler { + + public static final Logger logger = LoggerFactory.getLogger(CASLogoutSuccessHandler.class); + + private String casUrl; + private String defaultTarget; + + private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); + + @Override + public void onLogoutSuccess(HttpServletRequest request, + HttpServletResponse response, Authentication authentication) + throws IOException, ServletException { + + String referer = request.getHeader("referer"); + if (response.isCommitted()) { + logger.info("Response has already been committed. Unable to redirect to target"); + return; + } + redirectStrategy.sendRedirect(request, response, + (casUrl + "/logout?url=") + (referer != null ? referer : defaultTarget)); + + } + + public void setCasUrl(String casUrl) { + this.casUrl = casUrl; + } + + public void setDefaultTarget(String defaultTarget) { + this.defaultTarget = defaultTarget; + } +} diff --git a/src/main/java/de/thm/arsnova/LoginController.java b/src/main/java/de/thm/arsnova/LoginController.java index 2014662a..7dacb38d 100644 --- a/src/main/java/de/thm/arsnova/LoginController.java +++ b/src/main/java/de/thm/arsnova/LoginController.java @@ -118,6 +118,7 @@ public class LoginController { public View doLogout(final HttpServletRequest request) { Authentication auth = SecurityContextHolder.getContext().getAuthentication(); request.getSession().invalidate(); + SecurityContextHolder.clearContext(); if (auth instanceof CasAuthenticationToken) { return new RedirectView("/j_spring_cas_security_logout"); } diff --git a/src/main/webapp/WEB-INF/spring/spring-security.xml b/src/main/webapp/WEB-INF/spring/spring-security.xml index a53a8215..40e16c94 100644 --- a/src/main/webapp/WEB-INF/spring/spring-security.xml +++ b/src/main/webapp/WEB-INF/spring/spring-security.xml @@ -116,14 +116,17 @@ <bean id="requestSingleLogoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter" - p:filterProcessesUrl="/j_spring_cas_security_logout" > - <constructor-arg value="${security.cas-server-url}/logout?url=${security.arsnova-url}"/> - <constructor-arg> - <bean class= - "org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/> - </constructor-arg> + p:filterProcessesUrl="/j_spring_cas_security_logout"> + <constructor-arg ref="casLogoutSuccessHandler" /> + <constructor-arg> + <bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler"/> + </constructor-arg> </bean> + <bean id="casLogoutSuccessHandler" class="de.thm.arsnova.CASLogoutSuccessHandler" + p:casUrl="${security.cas-server-url}" + p:defaultTarget="${security.arsnova-url}"/> + <bean id="successHandler" class="de.thm.arsnova.LoginAuthenticationSucessHandler" p:targetUrl="#auth/checkLogin"/> -- GitLab