configurers) {
+ if (CollectionUtils.isEmpty(configurers)) {
+ return;
+ }
+ if (configurers.size() > 1) {
+ throw new IllegalStateException(configurers.size() + " implementations of " +
+ "CasClientConfigurer were found when only 1 was expected. " +
+ "Refactor the configuration such that CasClientConfigurer is " +
+ "implemented only once or not at all.");
+ }
+ this.casClientConfigurer = configurers.iterator().next();
+ }
+}
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
new file mode 100644
index 0000000..ca2bc06
--- /dev/null
+++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java
@@ -0,0 +1,227 @@
+package org.jasig.cas.client.boot.configuration;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.lang.NonNull;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * {@link ConfigurationProperties} for CAS Java client filters.
+ *
+ * Will be used to customize CAS filters via simple properties or YAML files in standard Spring Boot PropertySources.
+ *
+ * @author Dmitriy Kopylenko
+ * @since 3.6.0
+ */
+@ConfigurationProperties(prefix = "cas", ignoreUnknownFields = false)
+public class CasClientConfigurationProperties {
+
+ /**
+ * CAS server URL E.g. https://example.com/cas or https://cas.example. Required.
+ */
+ @NonNull
+ private String serverUrlPrefix;
+
+ /**
+ * CAS server login URL E.g. https://example.com/cas/login or https://cas.example/login. Required.
+ */
+ @NonNull
+ private String serverLoginUrl;
+
+ /**
+ * CAS-protected client application host URL E.g. https://myclient.example.com Required.
+ */
+ @NonNull
+ private String clientHostUrl;
+
+ /**
+ * List of URL patterns protected by CAS authentication filter.
+ */
+ private List authenticationUrlPatterns = new ArrayList<>();
+
+ /**
+ * List of URL patterns protected by CAS validation filter.
+ */
+ private List validationUrlPatterns = new ArrayList<>();
+
+ /**
+ * List of URL patterns protected by CAS request wrapper filter.
+ */
+ private List requestWrapperUrlPatterns = new ArrayList<>();
+
+ /**
+ * List of URL patterns protected by CAS assertion thread local filter.
+ */
+ private List assertionThreadLocalUrlPatterns = new ArrayList<>();
+
+ /**
+ * Authentication filter gateway parameter.
+ */
+ private Boolean gateway;
+
+ /**
+ * Validation filter useSession parameter.
+ */
+ private Boolean useSession;
+
+ /**
+ * Validation filter redirectAfterValidation.
+ */
+ private Boolean redirectAfterValidation;
+
+ /**
+ * Cas20ProxyReceivingTicketValidationFilter acceptAnyProxy parameter.
+ */
+ private Boolean acceptAnyProxy;
+
+ /**
+ * Cas20ProxyReceivingTicketValidationFilter allowedProxyChains parameter.
+ */
+ private List allowedProxyChains = new ArrayList<>();
+
+ /**
+ * Cas20ProxyReceivingTicketValidationFilter proxyCallbackUrl parameter.
+ */
+ private String proxyCallbackUrl;
+
+ /**
+ * Cas20ProxyReceivingTicketValidationFilter proxyReceptorUrl parameter.
+ */
+ private String proxyReceptorUrl;
+
+ /**
+ * ValidationType the CAS protocol validation type. Defaults to CAS3 if not explicitly set.
+ */
+ private EnableCasClient.ValidationType validationType = EnableCasClient.ValidationType.CAS3;
+
+ private Boolean skipTicketValidation = false;
+
+ public String getServerUrlPrefix() {
+ return serverUrlPrefix;
+ }
+
+ public void setServerUrlPrefix(final String serverUrlPrefix) {
+ this.serverUrlPrefix = serverUrlPrefix;
+ }
+
+ public String getServerLoginUrl() {
+ return serverLoginUrl;
+ }
+
+ public void setServerLoginUrl(final String serverLoginUrl) {
+ this.serverLoginUrl = serverLoginUrl;
+ }
+
+ public String getClientHostUrl() {
+ return clientHostUrl;
+ }
+
+ public void setClientHostUrl(final String clientHostUrl) {
+ this.clientHostUrl = clientHostUrl;
+ }
+
+ public Boolean getAcceptAnyProxy() {
+ return acceptAnyProxy;
+ }
+
+ public void setAcceptAnyProxy(final Boolean acceptAnyProxy) {
+ this.acceptAnyProxy = acceptAnyProxy;
+ }
+
+ public List getAllowedProxyChains() {
+ return allowedProxyChains;
+ }
+
+ public void setAllowedProxyChains(final List allowedProxyChains) {
+ this.allowedProxyChains = allowedProxyChains;
+ }
+
+ public String getProxyCallbackUrl() {
+ return proxyCallbackUrl;
+ }
+
+ public void setProxyCallbackUrl(final String proxyCallbackUrl) {
+ this.proxyCallbackUrl = proxyCallbackUrl;
+ }
+
+ public String getProxyReceptorUrl() {
+ return proxyReceptorUrl;
+ }
+
+ public void setProxyReceptorUrl(final String proxyReceptorUrl) {
+ this.proxyReceptorUrl = proxyReceptorUrl;
+ }
+
+ public Boolean getGateway() {
+ return gateway;
+ }
+
+ public void setGateway(final Boolean gateway) {
+ this.gateway = gateway;
+ }
+
+ public Boolean getUseSession() {
+ return useSession;
+ }
+
+ public void setUseSession(final Boolean useSession) {
+ this.useSession = useSession;
+ }
+
+ public Boolean getRedirectAfterValidation() {
+ return redirectAfterValidation;
+ }
+
+ public void setRedirectAfterValidation(final Boolean redirectAfterValidation) {
+ this.redirectAfterValidation = redirectAfterValidation;
+ }
+
+ public List getAssertionThreadLocalUrlPatterns() {
+ return assertionThreadLocalUrlPatterns;
+ }
+
+ public void setAssertionThreadLocalUrlPatterns(final List assertionThreadLocalUrlPatterns) {
+ this.assertionThreadLocalUrlPatterns = assertionThreadLocalUrlPatterns;
+ }
+
+ public List getRequestWrapperUrlPatterns() {
+ return requestWrapperUrlPatterns;
+ }
+
+ public void setRequestWrapperUrlPatterns(final List requestWrapperUrlPatterns) {
+ this.requestWrapperUrlPatterns = requestWrapperUrlPatterns;
+ }
+
+ public List getValidationUrlPatterns() {
+ return validationUrlPatterns;
+ }
+
+ public void setValidationUrlPatterns(final List validationUrlPatterns) {
+ this.validationUrlPatterns = validationUrlPatterns;
+ }
+
+ public List getAuthenticationUrlPatterns() {
+ return authenticationUrlPatterns;
+ }
+
+ public void setAuthenticationUrlPatterns(final List authenticationUrlPatterns) {
+ this.authenticationUrlPatterns = authenticationUrlPatterns;
+ }
+
+ public EnableCasClient.ValidationType getValidationType() {
+ return validationType;
+ }
+
+ public void setValidationType(final EnableCasClient.ValidationType validationType) {
+ this.validationType = validationType;
+ }
+
+ public Boolean getSkipTicketValidation() {
+ return skipTicketValidation;
+ }
+
+ public void setSkipTicketValidation(final Boolean skipTicketValidation) {
+ this.skipTicketValidation = skipTicketValidation;
+ }
+}
diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java
new file mode 100644
index 0000000..534a418
--- /dev/null
+++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java
@@ -0,0 +1,46 @@
+package org.jasig.cas.client.boot.configuration;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+
+/**
+ * Callback interface to be implemented by {@link org.springframework.context.annotation.Configuration Configuration} classes annotated with
+ * {@link EnableCasClient} that wish or need to
+ * explicitly configure or customize CAS client filters created by {@link CasClientConfiguration}.
+ *
+ * @author Dmitriy Kopylenko
+ * @since 3.6.0
+ */
+public interface CasClientConfigurer {
+
+ /**
+ * Configure or customize CAS authentication filter.
+ *
+ * @param authenticationFilter the authentication filter
+ */
+ default void configureAuthenticationFilter(final FilterRegistrationBean authenticationFilter) {
+ }
+
+ /**
+ * Configure or customize CAS validation filter.
+ *
+ * @param validationFilter the validation filter
+ */
+ default void configureValidationFilter(final FilterRegistrationBean validationFilter) {
+ }
+
+ /**
+ * Configure or customize CAS http servlet wrapper filter.
+ *
+ * @param httpServletRequestWrapperFilter the http servlet request wrapper filter
+ */
+ default void configureHttpServletRequestWrapperFilter(final FilterRegistrationBean httpServletRequestWrapperFilter) {
+ }
+
+ /**
+ * Configure or customize CAS assertion thread local filter.
+ *
+ * @param assertionThreadLocalFilter the assertion thread local filter
+ */
+ default void configureAssertionThreadLocalFilter(final FilterRegistrationBean assertionThreadLocalFilter) {
+ }
+}
diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java
new file mode 100644
index 0000000..5f95d7e
--- /dev/null
+++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java
@@ -0,0 +1,35 @@
+package org.jasig.cas.client.boot.configuration;
+
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Enables CAS Java client Servlet Filters configuration facility.
+ * To be used together with {@link org.springframework.context.annotation.Configuration Configuration}
+ * or {@link org.springframework.boot.autoconfigure.SpringBootApplication SpringBootApplication} classes.
+ *
+ * For those wishing to customize CAS filters during their creation, application configuration classes carrying this annotation
+ * may implement the {@link CasClientConfigurer} callback interface and override only necessary methods.
+ *
+ * @author Dmitriy Kopylenko
+ * @since 3.6.0
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import(CasClientConfiguration.class)
+public @interface EnableCasClient {
+
+ enum ValidationType {
+ CAS,
+ CAS3,
+ SAML
+ }
+}
diff --git a/pom.xml b/pom.xml
index 093a8a4..baea5c3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,24 +10,19 @@
cas-client
pom
- Jasig CAS Client for Java
+ Apereo CAS Client for Java
- Jasig CAS Client for Java is the integration point for applications that want to speak with a CAS
+ Apereo CAS Client for Java is the integration point for applications that want to speak with a CAS
server, either via the CAS 1.0 or CAS 2.0 protocol.
- http://www.jasig.org/cas
-
-
- JIRA
- https://issues.jasig.org/browse/CASC
-
+ https://www.apereo.org/cas
- scm:git:git@github.com:Jasig/java-cas-client.git
- scm:git:git@github.com:Jasig/java-cas-client.git
- https://github.com/Jasig/java-cas-client
- HEAD
-
+ scm:git:git@github.com:apereo/java-cas-client.git
+ scm:git:git@github.com:apereo/java-cas-client.git
+ https://github.com/apereo/java-cas-client
+ HEAD
+
2006
@@ -55,8 +50,8 @@
- Jasig
- http://www.jasig.org
+ Apereo
+ https://www.apereo.org
@@ -76,8 +71,8 @@
maven-compiler-plugin
3.8.1
- 1.6
- 1.6
+ 1.8
+ 1.8
@@ -190,6 +185,12 @@
${spring.version}