package org.apereo.cas.gua.config;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.configuration.model.support.gua.GraphicalUserAuthenticationProperties;
import org.apereo.cas.gua.api.UserGraphicalAuthenticationRepository;
import org.apereo.cas.gua.impl.LdapUserGraphicalAuthenticationRepository;
import org.apereo.cas.gua.impl.StaticUserGraphicalAuthenticationRepository;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.web.flow.AcceptUserGraphicsForAuthenticationAction;
import org.apereo.cas.web.flow.CasWebflowConfigurer;
import org.apereo.cas.web.flow.DisplayUserGraphicsBeforeAuthenticationAction;
import org.apereo.cas.web.flow.GraphicalUserAuthenticationWebflowConfigurer;
import org.apereo.cas.web.flow.PrepareForGraphicalAuthenticationAction;
import org.springframework.beans.factory.BeanCreationException;
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.definition.registry.FlowDefinitionRegistry;
import org.springframework.webflow.engine.builder.support.FlowBuilderServices;
import org.springframework.webflow.execution.Action;
/**
* This is {@link GraphicalUserAuthenticationConfiguration}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@Configuration("graphicalUserAuthenticationConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class GraphicalUserAuthenticationConfiguration {
@Autowired
private CasConfigurationProperties casProperties;
@Autowired
@Qualifier("loginFlowRegistry")
private FlowDefinitionRegistry loginFlowDefinitionRegistry;
@Autowired
@Qualifier("servicesManager")
private ServicesManager servicesManager;
@Autowired
private FlowBuilderServices flowBuilderServices;
@ConditionalOnMissingBean(name = "graphicalUserAuthenticationWebflowConfigurer")
@Bean
public CasWebflowConfigurer graphicalUserAuthenticationWebflowConfigurer() {
return new GraphicalUserAuthenticationWebflowConfigurer(flowBuilderServices, loginFlowDefinitionRegistry);
}
@Bean
@ConditionalOnMissingBean(name = "userGraphicalAuthenticationRepository")
public UserGraphicalAuthenticationRepository userGraphicalAuthenticationRepository() {
final GraphicalUserAuthenticationProperties gua = casProperties.getAuthn().getGua();
if (StringUtils.isNotBlank(gua.getResource().getLocation())) {
return new StaticUserGraphicalAuthenticationRepository();
}
if (StringUtils.isNotBlank(gua.getLdap().getLdapUrl())
&& StringUtils.isNotBlank(gua.getLdap().getUserFilter())
&& StringUtils.isNotBlank(gua.getLdap().getBaseDn())
&& StringUtils.isNotBlank(gua.getLdap().getImageAttribute())) {
return new LdapUserGraphicalAuthenticationRepository();
}
throw new BeanCreationException("A repository instance must be configured to locate user-defined graphics");
}
@Bean
@ConditionalOnMissingBean(name = "acceptUserGraphicsForAuthenticationAction")
public Action acceptUserGraphicsForAuthenticationAction() {
return new AcceptUserGraphicsForAuthenticationAction();
}
@Autowired
@Bean
public Action displayUserGraphicsBeforeAuthenticationAction(@Qualifier("userGraphicalAuthenticationRepository")
final UserGraphicalAuthenticationRepository repository) {
return new DisplayUserGraphicsBeforeAuthenticationAction(repository);
}
@Bean
public Action initializeLoginAction() {
return new PrepareForGraphicalAuthenticationAction(servicesManager);
}
}