package org.apereo.cas.config; import org.apereo.cas.adaptors.generic.remote.RemoteAddressAuthenticationHandler; import org.apereo.cas.adaptors.generic.remote.RemoteAddressNonInteractiveCredentialsAction; import org.apereo.cas.authentication.AuthenticationEventExecutionPlan; 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.AuthenticationEventExecutionPlanConfigurer; import org.apereo.cas.configuration.CasConfigurationProperties; import org.apereo.cas.configuration.model.support.generic.RemoteAddressAuthenticationProperties; import org.apereo.cas.services.ServicesManager; import org.apereo.cas.web.flow.CasWebflowConfigurer; import org.apereo.cas.web.flow.RemoteAddressWebflowConfigurer; import org.apereo.cas.web.flow.resolver.CasDelegatingWebflowEventResolver; import org.apereo.cas.web.flow.resolver.CasWebflowEventResolver; 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.cloud.context.config.annotation.RefreshScope; 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 CasRemoteAuthenticationConfiguration}. * * @author Misagh Moayyed * @since 5.0.0 */ @Configuration("casRemoteAuthenticationConfiguration") @EnableConfigurationProperties(CasConfigurationProperties.class) public class CasRemoteAuthenticationConfiguration { @Autowired @Qualifier("servicesManager") private ServicesManager servicesManager; @Autowired private CasConfigurationProperties casProperties; @Autowired @Qualifier("adaptiveAuthenticationPolicy") private AdaptiveAuthenticationPolicy adaptiveAuthenticationPolicy; @Autowired @Qualifier("serviceTicketRequestWebflowEventResolver") private CasWebflowEventResolver serviceTicketRequestWebflowEventResolver; @Autowired @Qualifier("initialAuthenticationAttemptWebflowEventResolver") private CasDelegatingWebflowEventResolver initialAuthenticationAttemptWebflowEventResolver; @Autowired @Qualifier("loginFlowRegistry") private FlowDefinitionRegistry loginFlowDefinitionRegistry; @Autowired private FlowBuilderServices flowBuilderServices; @ConditionalOnMissingBean(name = "remoteAddressWebflowConfigurer") @Bean public CasWebflowConfigurer remoteAddressWebflowConfigurer() { return new RemoteAddressWebflowConfigurer(flowBuilderServices, loginFlowDefinitionRegistry); } @Bean @RefreshScope public AuthenticationHandler remoteAddressAuthenticationHandler() { final RemoteAddressAuthenticationProperties remoteAddress = casProperties.getAuthn().getRemoteAddress(); final RemoteAddressAuthenticationHandler bean = new RemoteAddressAuthenticationHandler(remoteAddress.getName(), servicesManager, remoteAddressPrincipalFactory()); bean.setIpNetworkRange(remoteAddress.getIpAddressRange()); return bean; } @Bean public Action remoteAddressCheck() { return new RemoteAddressNonInteractiveCredentialsAction(initialAuthenticationAttemptWebflowEventResolver, serviceTicketRequestWebflowEventResolver, adaptiveAuthenticationPolicy); } @ConditionalOnMissingBean(name = "remoteAddressPrincipalFactory") @Bean public PrincipalFactory remoteAddressPrincipalFactory() { return new DefaultPrincipalFactory(); } /** * The type Remote address authentication event execution plan configuration. */ @Configuration("remoteAddressAuthenticationEventExecutionPlanConfiguration") @EnableConfigurationProperties(CasConfigurationProperties.class) public class RemoteAddressAuthenticationEventExecutionPlanConfiguration implements AuthenticationEventExecutionPlanConfigurer { @Autowired @Qualifier("personDirectoryPrincipalResolver") private PrincipalResolver personDirectoryPrincipalResolver; @Override public void configureAuthenticationExecutionPlan(final AuthenticationEventExecutionPlan plan) { plan.registerAuthenticationHandlerWithPrincipalResolver(remoteAddressAuthenticationHandler(), personDirectoryPrincipalResolver); } } }