Apereo CAS Core Multitenancy library providing tenant management capabilities for Central Authentication Service
npx @tessl/cli install tessl/maven-org-apereo-cas--cas-server-core-multitenancy@7.2.0CAS Server Core Multitenancy is a Java library that provides comprehensive tenant management capabilities for the Central Authentication Service (CAS). It enables multi-tenant authentication deployments where different organizations or environments can coexist within a single CAS infrastructure while maintaining complete isolation and customization capabilities for each tenant.
Maven:
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-core-multitenancy</artifactId>
<version>7.2.4</version>
</dependency>Gradle:
implementation 'org.apereo.cas:cas-server-core-multitenancy:7.2.4'import org.apereo.cas.multitenancy.TenantsManager;
import org.apereo.cas.multitenancy.TenantExtractor;
import org.apereo.cas.multitenancy.TenantDefinition;
import org.apereo.cas.multitenancy.DefaultTenantsManager;
import org.apereo.cas.multitenancy.DefaultTenantExtractor;import org.apereo.cas.multitenancy.*;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.util.Optional;
// Create a tenants manager with JSON configuration
Resource tenantsConfig = new ClassPathResource("tenants.json");
TenantsManager tenantsManager = new DefaultTenantsManager(tenantsConfig);
// Find a specific tenant
Optional<TenantDefinition> tenant = tenantsManager.findTenant("tenant1");
if (tenant.isPresent()) {
TenantDefinition tenantDef = tenant.get();
System.out.println("Tenant: " + tenantDef.getId());
System.out.println("Description: " + tenantDef.getDescription());
}
// Extract tenant from request path (requires CAS configuration)
CasConfigurationProperties casProperties = new CasConfigurationProperties();
TenantExtractor extractor = new DefaultTenantExtractor(tenantsManager, casProperties);
Optional<TenantDefinition> extractedTenant = extractor.extract("/tenants/tenant1/login");The CAS multitenancy module is built around several key components:
Core functionality for managing tenant definitions, including loading from JSON configuration files and providing lookup capabilities.
public interface TenantsManager {
Optional<TenantDefinition> findTenant(String tenantId);
List<TenantDefinition> findTenants();
}
public class DefaultTenantsManager implements TenantsManager, DisposableBean {
public DefaultTenantsManager();
public DefaultTenantsManager(Resource resource);
}System for extracting tenant context from HTTP requests using configurable URL patterns and request processing.
public interface TenantExtractor {
TenantsManager getTenantsManager();
Optional<TenantDefinition> extract(HttpServletRequest request);
Optional<TenantDefinition> extract(RequestContext requestContext);
Optional<TenantDefinition> extract(String requestPath);
static String tenantIdFromPath(String requestPath);
}
public class DefaultTenantExtractor implements TenantExtractor {
public DefaultTenantExtractor(TenantsManager tenantsManager, CasConfigurationProperties casProperties);
}Complete tenant configuration model with separate policy objects for different aspects of authentication and communication.
public class TenantDefinition implements Serializable {
private String id;
private String description;
private TenantAuthenticationPolicy authenticationPolicy;
private TenantCommunicationPolicy communicationPolicy;
private TenantDelegatedAuthenticationPolicy delegatedAuthenticationPolicy;
private TenantMultifactorAuthenticationPolicy multifactorAuthenticationPolicy;
public String getId();
public void setId(String id);
public String getDescription();
public void setDescription(String description);
public TenantAuthenticationPolicy getAuthenticationPolicy();
public void setAuthenticationPolicy(TenantAuthenticationPolicy authenticationPolicy);
public TenantCommunicationPolicy getCommunicationPolicy();
public void setCommunicationPolicy(TenantCommunicationPolicy communicationPolicy);
public TenantDelegatedAuthenticationPolicy getDelegatedAuthenticationPolicy();
public void setDelegatedAuthenticationPolicy(TenantDelegatedAuthenticationPolicy delegatedAuthenticationPolicy);
public TenantMultifactorAuthenticationPolicy getMultifactorAuthenticationPolicy();
public void setMultifactorAuthenticationPolicy(TenantMultifactorAuthenticationPolicy multifactorAuthenticationPolicy);
}Auto-configuration classes and beans for seamless Spring Boot integration with proper conditional configuration.
@AutoConfiguration
@EnableConfigurationProperties(CasConfigurationProperties.class)
@ConditionalOnFeatureEnabled(feature = CasFeatureModule.FeatureCatalog.Multitenancy)
public class CasCoreMultitenancyAutoConfiguration {
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
@ConditionalOnMissingBean(name = TenantsManager.BEAN_NAME)
public TenantsManager tenantsManager(CasConfigurationProperties casProperties) throws Exception;
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
@ConditionalOnMissingBean(name = TenantExtractor.BEAN_NAME)
public TenantExtractor tenantExtractor(CasConfigurationProperties casProperties,
@Qualifier(TenantsManager.BEAN_NAME) TenantsManager tenantsManager);
@Bean
@ConditionalOnMissingBean(name = "casMultitenancyEndpointConfigurer")
@RefreshScope(proxyMode = ScopedProxyMode.DEFAULT)
public CasWebSecurityConfigurer<HttpSecurity> casMultitenancyEndpointConfigurer();
}public interface TenantsManager {
String BEAN_NAME = "tenantsManager";
}
public interface TenantExtractor {
String BEAN_NAME = "tenantExtractor";
Pattern PATTERN_TENANTS = Pattern.compile("tenants/(.+)/(.+)", Pattern.CASE_INSENSITIVE);
}public class UnknownTenantException extends RuntimeException {
public UnknownTenantException(String message);
}