org.apereo.cas.config.CasOneTimeTokenAuthenticationAutoConfiguration Maven / Gradle / Ivy
package org.apereo.cas.config;
import org.apereo.cas.authentication.OneTimeToken;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.configuration.features.CasFeatureModule;
import org.apereo.cas.otp.repository.token.CachingOneTimeTokenRepository;
import org.apereo.cas.otp.repository.token.OneTimeTokenRepository;
import org.apereo.cas.otp.web.flow.OneTimeTokenAuthenticationWebflowAction;
import org.apereo.cas.util.spring.boot.ConditionalOnFeatureEnabled;
import org.apereo.cas.web.flow.CasWebflowConstants;
import org.apereo.cas.web.flow.actions.WebflowActionBeanSupplier;
import org.apereo.cas.web.flow.authentication.FinalMultifactorAuthenticationTransactionWebflowEventResolver;
import org.apereo.cas.web.flow.resolver.CasWebflowEventResolver;
import org.apereo.cas.web.flow.resolver.impl.CasWebflowEventResolutionConfigurationContext;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.webflow.execution.Action;
import java.time.Duration;
import java.util.Collection;
/**
* This is {@link CasOneTimeTokenAuthenticationAutoConfiguration}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@EnableConfigurationProperties(CasConfigurationProperties.class)
@EnableScheduling
@ConditionalOnFeatureEnabled(feature = CasFeatureModule.FeatureCatalog.MultifactorAuthentication, module = "otp")
@AutoConfiguration
public class CasOneTimeTokenAuthenticationAutoConfiguration {
private static final int EXPIRE_TOKENS_IN_SECONDS = 30;
private static final int INITIAL_CACHE_SIZE = 50;
private static final long MAX_CACHE_SIZE = 1_000_000;
@Configuration(value = "OneTimeTokenAuthenticationWebflowConfiguration", proxyBeanMethods = false)
@EnableConfigurationProperties(CasConfigurationProperties.class)
static class OneTimeTokenAuthenticationWebflowConfiguration {
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
@ConditionalOnMissingBean(name = "oneTimeTokenAuthenticationWebflowEventResolver")
public CasWebflowEventResolver oneTimeTokenAuthenticationWebflowEventResolver(
@Qualifier("casWebflowConfigurationContext")
final CasWebflowEventResolutionConfigurationContext casWebflowConfigurationContext) {
return new FinalMultifactorAuthenticationTransactionWebflowEventResolver(casWebflowConfigurationContext);
}
}
@Configuration(value = "OneTimeTokenAuthenticationActionConfiguration", proxyBeanMethods = false)
@EnableConfigurationProperties(CasConfigurationProperties.class)
static class OneTimeTokenAuthenticationActionConfiguration {
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
@ConditionalOnMissingBean(name = CasWebflowConstants.ACTION_ID_OTP_AUTHENTICATION_ACTION)
public Action oneTimeTokenAuthenticationWebflowAction(
final ConfigurableApplicationContext applicationContext,
final CasConfigurationProperties casProperties,
@Qualifier("oneTimeTokenAuthenticationWebflowEventResolver")
final CasWebflowEventResolver oneTimeTokenAuthenticationWebflowEventResolver) {
return WebflowActionBeanSupplier.builder()
.withApplicationContext(applicationContext)
.withProperties(casProperties)
.withAction(() -> new OneTimeTokenAuthenticationWebflowAction(oneTimeTokenAuthenticationWebflowEventResolver))
.withId(CasWebflowConstants.ACTION_ID_OTP_AUTHENTICATION_ACTION)
.build()
.get();
}
}
@Configuration(value = "OneTimeTokenAuthenticationRepositoryConfiguration", proxyBeanMethods = false)
@EnableConfigurationProperties(CasConfigurationProperties.class)
static class OneTimeTokenAuthenticationRepositoryConfiguration {
@ConditionalOnMissingBean(name = "oneTimeTokenAuthenticatorTokenRepository")
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public OneTimeTokenRepository oneTimeTokenAuthenticatorTokenRepository() {
final Cache> storage = Caffeine.newBuilder()
.initialCapacity(INITIAL_CACHE_SIZE)
.maximumSize(MAX_CACHE_SIZE)
.recordStats()
.expireAfterWrite(Duration.ofSeconds(EXPIRE_TOKENS_IN_SECONDS))
.build();
return new CachingOneTimeTokenRepository(storage);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy