PageRenderTime 42ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 0ms

/support/cas-server-support-radius-mfa/src/main/java/org/apereo/cas/config/support/authentication/RadiusTokenAuthenticationEventExecutionPlanConfiguration.java

https://github.com/frett/cas
Java | 126 lines | 103 code | 16 blank | 7 comment | 0 complexity | 9569c9078bad535f6e9d56da3cc85798 MD5 | raw file
  1. package org.apereo.cas.config.support.authentication;
  2. import org.apereo.cas.adaptors.radius.RadiusClientFactory;
  3. import org.apereo.cas.adaptors.radius.RadiusProtocol;
  4. import org.apereo.cas.adaptors.radius.RadiusServer;
  5. import org.apereo.cas.adaptors.radius.authentication.RadiusMultifactorAuthenticationProvider;
  6. import org.apereo.cas.adaptors.radius.authentication.RadiusTokenAuthenticationHandler;
  7. import org.apereo.cas.adaptors.radius.authentication.RadiusTokenCredential;
  8. import org.apereo.cas.adaptors.radius.server.NonBlockingRadiusServer;
  9. import org.apereo.cas.authentication.AuthenticationEventExecutionPlanConfigurer;
  10. import org.apereo.cas.authentication.AuthenticationMetaDataPopulator;
  11. import org.apereo.cas.authentication.MultifactorAuthenticationProvider;
  12. import org.apereo.cas.authentication.MultifactorAuthenticationProviderBypass;
  13. import org.apereo.cas.authentication.MultifactorAuthenticationUtils;
  14. import org.apereo.cas.authentication.handler.ByCredentialTypeAuthenticationHandlerResolver;
  15. import org.apereo.cas.authentication.metadata.AuthenticationContextAttributeMetaDataPopulator;
  16. import org.apereo.cas.authentication.principal.PrincipalFactory;
  17. import org.apereo.cas.authentication.principal.PrincipalFactoryUtils;
  18. import org.apereo.cas.configuration.CasConfigurationProperties;
  19. import org.apereo.cas.services.ServicesManager;
  20. import lombok.val;
  21. import org.springframework.beans.factory.ObjectProvider;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.beans.factory.annotation.Qualifier;
  24. import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
  25. import org.springframework.boot.context.properties.EnableConfigurationProperties;
  26. import org.springframework.cloud.context.config.annotation.RefreshScope;
  27. import org.springframework.context.annotation.Bean;
  28. import org.springframework.context.annotation.Configuration;
  29. import java.util.ArrayList;
  30. import java.util.List;
  31. /**
  32. * This is {@link RadiusTokenAuthenticationEventExecutionPlanConfiguration}.
  33. *
  34. * @author Misagh Moayyed
  35. * @author Dmitriy Kopylenko
  36. * @since 5.1.0
  37. */
  38. @Configuration("radiusTokenAuthenticationEventExecutionPlanConfiguration")
  39. @EnableConfigurationProperties(CasConfigurationProperties.class)
  40. public class RadiusTokenAuthenticationEventExecutionPlanConfiguration {
  41. @Autowired
  42. private CasConfigurationProperties casProperties;
  43. @Autowired
  44. @Qualifier("servicesManager")
  45. private ObjectProvider<ServicesManager> servicesManager;
  46. @RefreshScope
  47. @Bean
  48. public MultifactorAuthenticationProvider radiusAuthenticationProvider() {
  49. val radius = casProperties.getAuthn().getMfa().getRadius();
  50. val p = new RadiusMultifactorAuthenticationProvider(radiusTokenServers());
  51. p.setBypassEvaluator(radiusBypassEvaluator());
  52. p.setFailureMode(radius.getFailureMode());
  53. p.setOrder(radius.getRank());
  54. p.setId(radius.getId());
  55. return p;
  56. }
  57. @Bean
  58. @RefreshScope
  59. public MultifactorAuthenticationProviderBypass radiusBypassEvaluator() {
  60. return MultifactorAuthenticationUtils.newMultifactorAuthenticationProviderBypass(casProperties.getAuthn().getMfa().getRadius().getBypass());
  61. }
  62. @RefreshScope
  63. @Bean
  64. public List<RadiusServer> radiusTokenServers() {
  65. val list = new ArrayList<RadiusServer>();
  66. val radius = casProperties.getAuthn().getMfa().getRadius();
  67. val client = radius.getClient();
  68. val server = radius.getServer();
  69. val factory = new RadiusClientFactory(client.getAccountingPort(), client.getAuthenticationPort(), client.getSocketTimeout(),
  70. client.getInetAddress(), client.getSharedSecret());
  71. val protocol = RadiusProtocol.valueOf(server.getProtocol());
  72. val impl = new NonBlockingRadiusServer(protocol, factory, server.getRetries(),
  73. server.getNasIpAddress(), server.getNasIpv6Address(),
  74. server.getNasPort(), server.getNasPortId(),
  75. server.getNasIdentifier(), server.getNasRealPort(), server.getNasPortType());
  76. list.add(impl);
  77. return list;
  78. }
  79. @ConditionalOnMissingBean(name = "radiusTokenPrincipalFactory")
  80. @Bean
  81. public PrincipalFactory radiusTokenPrincipalFactory() {
  82. return PrincipalFactoryUtils.newPrincipalFactory();
  83. }
  84. @RefreshScope
  85. @Bean
  86. public RadiusTokenAuthenticationHandler radiusTokenAuthenticationHandler() {
  87. val radius = casProperties.getAuthn().getMfa().getRadius();
  88. return new RadiusTokenAuthenticationHandler(radius.getName(), servicesManager.getIfAvailable(),
  89. radiusTokenPrincipalFactory(), radiusTokenServers(),
  90. radius.isFailoverOnException(), radius.isFailoverOnAuthenticationFailure());
  91. }
  92. @Bean
  93. @RefreshScope
  94. public AuthenticationMetaDataPopulator radiusAuthenticationMetaDataPopulator() {
  95. val attribute = casProperties.getAuthn().getMfa().getAuthenticationContextAttribute();
  96. return new AuthenticationContextAttributeMetaDataPopulator(attribute,
  97. radiusTokenAuthenticationHandler(),
  98. radiusAuthenticationProvider().getId()
  99. );
  100. }
  101. @ConditionalOnMissingBean(name = "radiusTokenAuthenticationEventExecutionPlanConfigurer")
  102. @Bean
  103. public AuthenticationEventExecutionPlanConfigurer radiusTokenAuthenticationEventExecutionPlanConfigurer() {
  104. return plan -> {
  105. plan.registerAuthenticationHandler(radiusTokenAuthenticationHandler());
  106. plan.registerMetadataPopulator(radiusAuthenticationMetaDataPopulator());
  107. plan.registerAuthenticationHandlerResolver(new ByCredentialTypeAuthenticationHandlerResolver(RadiusTokenCredential.class));
  108. };
  109. }
  110. }