From 62cc93399f98a7d906d15c51fb5354e06f6283ca Mon Sep 17 00:00:00 2001 From: Gahon Date: Thu, 7 Nov 2019 15:56:45 +0800 Subject: [PATCH] add central logout support for springboot (#388) * add dependence to generated metadata for springboot * add central logout support for springboot --- README.md | 1 + cas-client-support-springboot/pom.xml | 9 +++++++ .../configuration/CasClientConfiguration.java | 26 ++++++++++++++++++ .../CasClientConfigurationProperties.java | 27 +++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/README.md b/README.md index 65785ce..24537ce 100644 --- a/README.md +++ b/README.md @@ -723,6 +723,7 @@ cas.validation-type=SAML ### Available optional properties +* `cas.single-logout.enabled` * `cas.authentication-url-patterns` * `cas.validation-url-patterns` * `cas.request-wrapper-url-patterns` diff --git a/cas-client-support-springboot/pom.xml b/cas-client-support-springboot/pom.xml index 29b8610..3dd32ce 100644 --- a/cas-client-support-springboot/pom.xml +++ b/cas-client-support-springboot/pom.xml @@ -58,6 +58,15 @@ spring-context provided + + + org.springframework.boot + spring-boot-configuration-processor + true + ${springboot.version} + provided + + org.jasig.cas.client diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java index bbd2ebc..a57dc8d 100644 --- a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java @@ -20,6 +20,8 @@ package org.jasig.cas.client.boot.configuration; import org.jasig.cas.client.authentication.AuthenticationFilter; import org.jasig.cas.client.authentication.Saml11AuthenticationFilter; +import org.jasig.cas.client.session.SingleSignOutFilter; +import org.jasig.cas.client.session.SingleSignOutHttpSessionListener; import org.jasig.cas.client.util.AssertionThreadLocalFilter; import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter; @@ -29,8 +31,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -40,6 +44,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.EventListener; /** * Configuration class providing default CAS client infrastructure filters. @@ -199,4 +204,25 @@ public class CasClientConfiguration { } this.casClientConfigurer = configurers.iterator().next(); } + + @Bean + @ConditionalOnProperty(prefix = "cas", value = "single-logout.enabled", havingValue = "true") + public FilterRegistrationBean casSingleSignOutFilter() { + final FilterRegistrationBean singleSignOutFilter = new FilterRegistrationBean(); + singleSignOutFilter.setFilter(new SingleSignOutFilter()); + Map initParameters = new HashMap<>(1); + initParameters.put("casServerUrlPrefix", configProps.getServerUrlPrefix()); + singleSignOutFilter.setInitParameters(initParameters); + singleSignOutFilter.setOrder(Ordered.HIGHEST_PRECEDENCE); + return singleSignOutFilter; + } + + @Bean + @ConditionalOnProperty(prefix = "cas", value = "single-logout.enabled", havingValue = "true") + public ServletListenerRegistrationBean casSingleSignOutListener(){ + ServletListenerRegistrationBean singleSignOutListener = new ServletListenerRegistrationBean<>(); + singleSignOutListener.setListener(new SingleSignOutHttpSessionListener()); + singleSignOutListener.setOrder(Ordered.HIGHEST_PRECEDENCE); + return singleSignOutListener; + } } diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java index 614c4ea..1ed713c 100644 --- a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java @@ -115,6 +115,24 @@ public class CasClientConfigurationProperties { private Boolean skipTicketValidation = false; + private SingleLogout singleLogout; + + public static class SingleLogout{ + /** + * whether to receive the single logout request from cas server. + */ + private boolean enabled = false; + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + } + + public String getServerUrlPrefix() { return serverUrlPrefix; } @@ -242,4 +260,13 @@ public class CasClientConfigurationProperties { public void setSkipTicketValidation(final Boolean skipTicketValidation) { this.skipTicketValidation = skipTicketValidation; } + + public SingleLogout getSingleLogout() { + return singleLogout; + } + + public void setSingleLogout(SingleLogout singleLogout) { + this.singleLogout = singleLogout; + } + }