CAS 6.4.4.2 with MongoDB for Service-, Ticket-Registry and Session-Storage

141 views
Skip to first unread message

martin....@springer.com

unread,
Jan 17, 2022, 11:33:31 AM1/17/22
to CAS Community
Hi cas-users, 

Using CAS 6.4.4.2 with MongoDB for Service-, Ticket-Registry and Session-Storage at the same time fails to auto-configure in my setup. 

My observations so far:

1. Adding 
------------------------------------------------------------------------------------------------
implementation "org.apereo.cas:cas-server-support-session-mongo:${project.'cas.version'}"
------------------------------------------------------------------------------------------------

to build.gradle only,  also requires to re-enable MongoAutoConfiguration and MongoDataAutoConfigration by overriding config key spring.autoconfigure.exclude since /webapp/cas-server-webapp-resources/src/main/resources/application.properties disables it:

------------------------------------------------------------------------------------------------
 spring.autoconfigure.exclude= \
   org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
   org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
   org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration
------------------------------------------------------------------------------------------------

otherwise no MongoTemplate is found at all:

------------------------------------------------------------------------------------------------
**************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method mongoSessionRepository in org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration required a bean of type 'org.springframework.data.mongodb.core.MongoOperations' that could not be found.


Action:

Consider defining a bean of type 'org.springframework.data.mongodb.core.MongoOperations' in your configuration.
------------------------------------------------------------------------------------------------


2. Additionally enabling 

------------------------------------------------------------------------------------------------
implementation "org.apereo.cas:cas-server-support-mongo-service-registry:${project.'cas.version'}"
implementation "org.apereo.cas:cas-server-support-mongo-ticket-registry:${project.'cas.version'}"
------------------------------------------------------------------------------------------------

Modules cas-server-support-mongo-service-registry and cas-server-support-mongo-ticket-registry both configure named MongoTemplate beans, which they actually do even use themselves, but lead to ambiguity when resolving a single candidate for the cas-server-support-session-mongo module.

Removing these @Bean definitions solves this problem:

------------------------------------------------------------------------------------------------
diff --git a/support/cas-server-support-mongo-service-registry/src/main/java/org/apereo/cas/config/MongoDbServiceRegistryConfiguration.java b/support/cas-server-support-mongo-service-registry/src/main/java/org/apereo/cas/config/MongoDbServiceRegistryConfiguration.java
index 0227845922..9ed3aea44d 100644
--- a/support/cas-server-support-mongo-service-registry/src/main/java/org/apereo/cas/config/MongoDbServiceRegistryConfiguration.java
+++ b/support/cas-server-support-mongo-service-registry/src/main/java/org/apereo/cas/config/MongoDbServiceRegistryConfiguration.java
@@ -47,9 +47,7 @@ public class MongoDbServiceRegistryConfiguration {
     @Qualifier("sslContext")
     private ObjectProvider<SSLContext> sslContext;
 
-    @ConditionalOnMissingBean(name = "mongoDbServiceRegistryTemplate")
-    @Bean
-    public MongoTemplate mongoDbServiceRegistryTemplate() {
+    private MongoTemplate mongoDbServiceRegistryTemplate() {
         val mongo = casProperties.getServiceRegistry().getMongo();
         val factory = new MongoDbConnectionFactory(sslContext.getObject());
 
diff --git a/support/cas-server-support-mongo-ticket-registry/src/main/java/org/apereo/cas/config/MongoDbTicketRegistryConfiguration.java b/support/cas-server-support-mongo-ticket-registry/src/main/java/org/apereo/cas/config/MongoDbTicketRegistryConfiguration.java
index 0a5b538a33..9195ff88a7 100644
--- a/support/cas-server-support-mongo-ticket-registry/src/main/java/org/apereo/cas/config/MongoDbTicketRegistryConfiguration.java
+++ b/support/cas-server-support-mongo-ticket-registry/src/main/java/org/apereo/cas/config/MongoDbTicketRegistryConfiguration.java
@@ -55,10 +55,7 @@ public class MongoDbTicketRegistryConfiguration {
         return registry;
     }
 
-    @ConditionalOnMissingBean(name = "mongoDbTicketRegistryTemplate")
-    @Bean
-    @RefreshScope
-    public MongoTemplate mongoDbTicketRegistryTemplate() {
+    private MongoTemplate mongoDbTicketRegistryTemplate() {
         val factory = new MongoDbConnectionFactory(sslContext.getObject());
         val mongo = casProperties.getTicket().getRegistry().getMongo();
         return factory.buildMongoTemplate(mongo);
------------------------------------------------------------------------------------------------

otherwise it fails with 

------------------------------------------------------------------------------------------------
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method mongoSessionRepository in org.springframework.session.data.mongo.config.annotation.web.http.MongoHttpSessionConfiguration required a single bean, but 2 were found:
        - mongoDbServiceRegistryTemplate: defined by method 'mongoDbServiceRegistryTemplate' in class path resource [org/apereo/cas/config/MongoDbServiceRegistryConfiguration.class]
        - mongoDbTicketRegistryTemplate: defined in BeanDefinition defined in class path resource [org/apereo/cas/config/MongoDbTicketRegistryConfiguration.class]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed
------------------------------------------------------------------------------------------------

My question now is, how can I fix this nonfunctional behavior without patching the original CAS 6.4.4.2 modules cas-server-support-mongo-service-registry and cas-server-support-mongo-ticket-registry? Is there better, easier or more elegant way to use MongoDB for Session, Service and Ticket Storage at the same time?

Regards

Martin





martin....@springer.com

unread,
Jan 17, 2022, 2:15:25 PM1/17/22
to CAS Community, martin....@springer.com
ah sorry for the typo,  in line
...
Modules cas-server-support-mongo-service-registry and cas-server-support-mongo-ticket-registry both configure named MongoTemplate beans, which they actually do even use themselves, but lead to ambiguity when resolving a single candidate for the cas-server-support-session-mongo module.
...

I forgot the important word "NOT". Instead it should read:
...
Modules cas-server-support-mongo-service-registry and cas-server-support-mongo-ticket-registry both configure named MongoTemplate beans, which they actually do NOT even use themselves, but lead to ambiguity when resolving a single candidate for the cas-server-support-session-mongo module.
....
Reply all
Reply to author
Forward
0 new messages