package org.apereo.cas.config;
import org.apereo.cas.authentication.AuthenticationPolicy;
import org.apereo.cas.authentication.ContextualAuthenticationPolicyFactory;
import org.apereo.cas.authentication.adaptive.AdaptiveAuthenticationPolicy;
import org.apereo.cas.authentication.adaptive.DefaultAdaptiveAuthenticationPolicy;
import org.apereo.cas.authentication.adaptive.geo.GeoLocationService;
import org.apereo.cas.authentication.policy.AllAuthenticationPolicy;
import org.apereo.cas.authentication.policy.AnyAuthenticationPolicy;
import org.apereo.cas.authentication.policy.NotPreventedAuthenticationPolicy;
import org.apereo.cas.authentication.policy.RequiredHandlerAuthenticationPolicy;
import org.apereo.cas.authentication.policy.RequiredHandlerAuthenticationPolicyFactory;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.configuration.model.core.authentication.AuthenticationPolicyProperties;
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 java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* This is {@link CasCoreAuthenticationPolicyConfiguration}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@Configuration("casCoreAuthenticationPolicyConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class CasCoreAuthenticationPolicyConfiguration {
@Autowired(required = false)
@Qualifier("geoLocationService")
private GeoLocationService geoLocationService;
@Autowired
private CasConfigurationProperties casProperties;
@ConditionalOnMissingBean(name = "authenticationPolicy")
@Bean
public Collection<AuthenticationPolicy> authenticationPolicy() {
final AuthenticationPolicyProperties police = casProperties.getAuthn().getPolicy();
if (police.getReq().isEnabled()) {
final List<AuthenticationPolicy> policies = new ArrayList<>();
policies.add(new RequiredHandlerAuthenticationPolicy(police.getReq().getHandlerName(), police.getReq().isTryAll()));
return policies;
}
if (police.getAll().isEnabled()) {
final List<AuthenticationPolicy> policies = new ArrayList<>();
policies.add(new AllAuthenticationPolicy());
return policies;
}
if (police.getNotPrevented().isEnabled()) {
final List<AuthenticationPolicy> policies = new ArrayList<>();
policies.add(new NotPreventedAuthenticationPolicy());
return policies;
}
final List<AuthenticationPolicy> policies = new ArrayList<>();
policies.add(new AnyAuthenticationPolicy(police.getAny().isTryAll()));
return policies;
}
@Bean
public AuthenticationPolicy notPreventedAuthenticationPolicy() {
return new NotPreventedAuthenticationPolicy();
}
@ConditionalOnMissingBean(name = "adaptiveAuthenticationPolicy")
@Bean
public AdaptiveAuthenticationPolicy adaptiveAuthenticationPolicy() {
final DefaultAdaptiveAuthenticationPolicy p = new DefaultAdaptiveAuthenticationPolicy();
p.setGeoLocationService(this.geoLocationService);
p.setAdaptiveAuthenticationProperties(casProperties.getAuthn().getAdaptive());
return p;
}
@ConditionalOnMissingBean(name = "requiredHandlerAuthenticationPolicyFactory")
@Bean
public ContextualAuthenticationPolicyFactory requiredHandlerAuthenticationPolicyFactory() {
return new RequiredHandlerAuthenticationPolicyFactory();
}
}