Skip to content

Commit

Permalink
break down token functionality into 3 distinct modules
Browse files Browse the repository at this point in the history
  • Loading branch information
SavvasMisaghMoayyed committed Jun 11, 2017
1 parent 5eb976a commit b163f59
Show file tree
Hide file tree
Showing 26 changed files with 187 additions and 71 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package org.apereo.cas.authentication.principal;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.AnnotationAwareOrderComparator;

Expand All @@ -17,15 +16,16 @@
public class DefaultWebApplicationResponseBuilderLocator implements ResponseBuilderLocator<WebApplicationService> {

private static final long serialVersionUID = 388417797622191740L;
private final transient List<ResponseBuilder> builders;

@Autowired
private ApplicationContext applicationContext;
public DefaultWebApplicationResponseBuilderLocator(final ApplicationContext applicationContext) {
final Map<String, ResponseBuilder> beans = applicationContext.getBeansOfType(ResponseBuilder.class, false, true);
this.builders = beans.values().stream().collect(Collectors.toList());
AnnotationAwareOrderComparator.sortIfNecessary(builders);
}

@Override
public ResponseBuilder locate(final WebApplicationService service) {
final Map<String, ResponseBuilder> beans = applicationContext.getBeansOfType(ResponseBuilder.class, false, true);
final List<ResponseBuilder> builders = beans.values().stream().collect(Collectors.toList());
AnnotationAwareOrderComparator.sortIfNecessary(builders);
return builders.stream().filter(r -> r.supports(service)).findFirst().orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public PersistentIdGenerator shibbolethCompatiblePersistentIdGenerator() {
@ConditionalOnMissingBean(name = "webApplicationResponseBuilderLocator")
@Bean
public ResponseBuilderLocator webApplicationResponseBuilderLocator() {
return new DefaultWebApplicationResponseBuilderLocator();
return new DefaultWebApplicationResponseBuilderLocator(applicationContext);
}

@ConditionalOnMissingBean(name = "webApplicationServiceResponseBuilder")
Expand Down
4 changes: 3 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,9 @@ include "support:cas-server-support-wsfederation-webflow"
include "support:cas-server-support-radius-core"
include "support:cas-server-support-radius"
include "support:cas-server-support-radius-mfa"
include "support:cas-server-support-token"
include "support:cas-server-support-token-core"
include "support:cas-server-support-token-authentication"
include "support:cas-server-support-token-tickets"
include "support:cas-server-support-token-webflow"
include "support:cas-server-support-sms-twillio"
include "support:cas-server-support-sms-textmagic"
Expand Down
19 changes: 19 additions & 0 deletions support/cas-server-support-token-authentication/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
description = "Apereo CAS JWT Token Authentication Support"
dependencies {
compile project(":api:cas-server-core-api")
compile project(":core:cas-server-core-web")
compile project(":core:cas-server-core-webflow")
compile project(":core:cas-server-core-authentication")
compile project(":core:cas-server-core-services")
compile project(":support:cas-server-support-pac4j-authentication")
compile project(":support:cas-server-support-token-core")

implementation libraries.pac4j
implementation libraries.casclient
testImplementation project(":core:cas-server-core-authentication")
testImplementation project(":core:cas-server-core")
testImplementation project(":core:cas-server-core-logout")
testImplementation project(":support:cas-server-support-cookie")
testImplementation project(path: ":core:cas-server-core-authentication", configuration: "tests")
testImplementation project(path: ":core:cas-server-core-util", configuration: "tests")
}
Original file line number Diff line number Diff line change
@@ -1,79 +1,39 @@
package org.apereo.cas.token.config;
package org.apereo.cas.config;

import org.apereo.cas.CipherExecutor;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlan;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer;
import org.apereo.cas.authentication.AuthenticationHandler;
import org.apereo.cas.authentication.adaptive.AdaptiveAuthenticationPolicy;
import org.apereo.cas.authentication.principal.DefaultPrincipalFactory;
import org.apereo.cas.authentication.principal.PrincipalFactory;
import org.apereo.cas.authentication.principal.PrincipalResolver;
import org.apereo.cas.authentication.principal.ResponseBuilder;
import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.configuration.model.core.util.CryptographyProperties;
import org.apereo.cas.configuration.model.support.token.TokenAuthenticationProperties;
import org.apereo.cas.configuration.support.Beans;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.ticket.ExpirationPolicy;
import org.apereo.cas.token.authentication.TokenAuthenticationHandler;
import org.apereo.cas.token.authentication.principal.TokenWebApplicationServiceResponseBuilder;
import org.apereo.cas.token.cipher.TokenTicketCipherExecutor;
import org.apereo.cas.token.webflow.TokenAuthenticationAction;
import org.apereo.cas.web.flow.resolver.CasDelegatingWebflowEventResolver;
import org.apereo.cas.web.flow.resolver.CasWebflowEventResolver;
import org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.webflow.execution.Action;

/**
* This is {@link TokenAuthenticationConfiguration}.
*
* @author Misagh Moayyed
* @since 5.0.0
* @since 5.2.0
*/
@Configuration("tokenAuthenticationConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class TokenAuthenticationConfiguration {

@Autowired
private CasConfigurationProperties casProperties;

@Autowired
@Qualifier("casClientTicketValidator")
private AbstractUrlBasedTicketValidator casClientTicketValidator;

@Autowired
@Qualifier("adaptiveAuthenticationPolicy")
private AdaptiveAuthenticationPolicy adaptiveAuthenticationPolicy;

@Autowired
@Qualifier("serviceTicketRequestWebflowEventResolver")
private CasWebflowEventResolver serviceTicketRequestWebflowEventResolver;

@Autowired
@Qualifier("initialAuthenticationAttemptWebflowEventResolver")
private CasDelegatingWebflowEventResolver initialAuthenticationAttemptWebflowEventResolver;

@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;

@Autowired
@Qualifier("grantingTicketExpirationPolicy")
private ExpirationPolicy grantingTicketExpirationPolicy;

@Bean
public ResponseBuilder webApplicationServiceResponseBuilder() {
return new TokenWebApplicationServiceResponseBuilder(servicesManager,
tokenCipherExecutor(),
grantingTicketExpirationPolicy,
casClientTicketValidator);
}

@ConditionalOnMissingBean(name = "tokenPrincipalFactory")
@Bean
Expand All @@ -88,18 +48,6 @@ public AuthenticationHandler tokenAuthenticationHandler() {
Beans.newPrincipalNameTransformer(token.getPrincipalTransformation()));
}

@Bean
public Action tokenAuthenticationAction() {
return new TokenAuthenticationAction(initialAuthenticationAttemptWebflowEventResolver, serviceTicketRequestWebflowEventResolver,
adaptiveAuthenticationPolicy, servicesManager);
}

@Bean
public CipherExecutor tokenCipherExecutor() {
final CryptographyProperties crypto = casProperties.getAuthn().getToken().getCrypto();
return new TokenTicketCipherExecutor(crypto.getEncryption().getKey(), crypto.getSigning().getKey());
}

/**
* The type Token authentication event execution plan configuration.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apereo.cas.token.config.TokenAuthenticationConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apereo.cas.config.TokenAuthenticationConfiguration
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
description = "Apereo CAS JWT Token Authentication Support"
description = "Apereo CAS JWT Token Core"
dependencies {
compile project(":api:cas-server-core-api")
compile project(":core:cas-server-core-web")
Expand All @@ -9,6 +9,7 @@ dependencies {

implementation libraries.pac4j
implementation libraries.casclient

testImplementation project(":core:cas-server-core-authentication")
testImplementation project(":core:cas-server-core")
testImplementation project(":core:cas-server-core-logout")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.apereo.cas.token.config;

import org.apereo.cas.configuration.CasConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

/**
* This is {@link TokenCoreConfiguration}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Configuration("tokenAuthenticationConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class TokenCoreConfiguration {


}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apereo.cas.token.config.TokenCoreConfiguration
17 changes: 17 additions & 0 deletions support/cas-server-support-token-tickets/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
description = "Apereo CAS JWT Token Authentication Support"
dependencies {
compile project(":api:cas-server-core-api")
compile project(":core:cas-server-core-web")
compile project(":core:cas-server-core-webflow")
compile project(":core:cas-server-core-authentication")
compile project(":core:cas-server-core-services")
compile project(":support:cas-server-support-token-core")
compile project(":support:cas-server-support-pac4j-authentication")
testImplementation project(":core:cas-server-core-authentication")
testImplementation project(":core:cas-server-core")
testImplementation project(":core:cas-server-core-logout")
testImplementation project(":support:cas-server-support-cookie")
testImplementation project(path: ":core:cas-server-core-authentication", configuration: "tests")
testImplementation project(path: ":core:cas-server-core-util", configuration: "tests")

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.apereo.cas.config;

import org.apereo.cas.CipherExecutor;
import org.apereo.cas.authentication.principal.ResponseBuilder;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.configuration.model.core.util.CryptographyProperties;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.ticket.ExpirationPolicy;
import org.apereo.cas.token.authentication.principal.TokenWebApplicationServiceResponseBuilder;
import org.apereo.cas.token.cipher.TokenTicketCipherExecutor;
import org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* This is {@link TokenTicketsConfiguration}.
*
* @author Misagh Moayyed
* @since 5.2.0
*/
@Configuration("tokenTicketsConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class TokenTicketsConfiguration {
@Autowired
private CasConfigurationProperties casProperties;

@Autowired
@Qualifier("casClientTicketValidator")
private AbstractUrlBasedTicketValidator casClientTicketValidator;

@Autowired
@Qualifier("grantingTicketExpirationPolicy")
private ExpirationPolicy grantingTicketExpirationPolicy;

@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;

@Bean
public ResponseBuilder webApplicationServiceResponseBuilder() {
return new TokenWebApplicationServiceResponseBuilder(servicesManager,
tokenCipherExecutor(),
grantingTicketExpirationPolicy,
casClientTicketValidator);
}

@Bean
public CipherExecutor tokenCipherExecutor() {
final CryptographyProperties crypto = casProperties.getAuthn().getToken().getCrypto();
return new TokenTicketCipherExecutor(crypto.getEncryption().getKey(), crypto.getSigning().getKey());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=org.apereo.cas.config.TokenTicketsConfiguration
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
import org.apereo.cas.config.support.CasWebApplicationServiceFactoryConfiguration;
import org.apereo.cas.logout.config.CasCoreLogoutConfiguration;
import org.apereo.cas.token.cipher.TokenTicketCipherExecutor;
import org.apereo.cas.token.config.TokenAuthenticationConfiguration;
import org.apereo.cas.token.config.TokenCoreConfiguration;
import org.apereo.cas.web.config.CasCookieConfiguration;
import org.apereo.cas.web.flow.config.CasCoreWebflowConfiguration;
import org.junit.Test;
Expand All @@ -50,7 +50,7 @@
CasCoreTicketIdGeneratorsConfiguration.class,
CasWebApplicationServiceFactoryConfiguration.class,
CasCoreUtilConfiguration.class,
TokenAuthenticationConfiguration.class,
TokenCoreConfiguration.class,
CasCoreServicesConfiguration.class,
CasPersonDirectoryConfiguration.class,
CasCoreWebConfiguration.class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Configuration shutdownHook="disable">
<Appenders>
<Console name="console" target="SYSTEM_OUT">
<PatternLayout pattern="%d %p [%c] - &lt;%m&gt;%n"/>
</Console>
<RollingFile name="file" fileName="build/jwttokentickets.log" append="true"
filePattern="mongo-%d{yyyy-MM-dd-HH}-%i.log.gz">
<PatternLayout pattern="%d %p [%c] - %m%n"/>
<Policies>
<OnStartupTriggeringPolicy />
<SizeBasedTriggeringPolicy size="10 MB"/>
<TimeBasedTriggeringPolicy />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="org.apereo" level="info" additivity="false">
<AppenderRef ref="console"/>
</Logger>
<Root level="warn">
<AppenderRef ref="console"/>
</Root>
</Loggers>
</Configuration>
Empty file.
4 changes: 2 additions & 2 deletions support/cas-server-support-token-webflow/build.gradle
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@

description = "Apereo CAS Token Authentication Webflow Support"
dependencies {
compile project(":core:cas-server-core-webflow")
compile project(":support:cas-server-support-token")
compile project(":support:cas-server-support-token-core")
compile project(":support:cas-server-support-token-authentication")
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.apereo.cas.token.webflow;
package org.apereo.cas.web.flow;

import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.Credential;
Expand All @@ -9,7 +9,6 @@
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.token.TokenConstants;
import org.apereo.cas.token.authentication.TokenCredential;
import org.apereo.cas.web.flow.AbstractNonInteractiveCredentialsAction;
import org.apereo.cas.web.flow.resolver.CasDelegatingWebflowEventResolver;
import org.apereo.cas.web.flow.resolver.CasWebflowEventResolver;
import org.apereo.cas.web.support.WebUtils;
Expand Down

0 comments on commit b163f59

Please sign in to comment.