Hi,

I am trying to implement custom cas logout. I have implemented custom cas 
login which works perfectly fine. 

I have created a a class which implements LogoutManager and another one 
which implements LogoutHandler.

I created a third class to register my custom logout handler which 
implements LogoutExecutionPlanConfigurer

In this configuration class I have following code which is causing problem.


    @Bean
   SingleLogoutServiceLogoutUrlBuilder singleLogoutServiceLogoutUrlBuilder(){
      return new DefaultSingleLogoutServiceLogoutUrlBuilder(urlValidator());
   }

   @Bean
   UrlValidator urlValidator() {
      return new UrlValidator(){
         @Override public boolean isValid(String s) {
            return 
org.apache.commons.validator.routines.UrlValidator.getInstance().isValid(s);
         }

         @Override public boolean isValidDomain(String s) {
            return DomainValidator.getInstance().isValid(s);
         }
      };
   }


I am getting below error 

2018-05-23 14:59:06,489 WARN 
[org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext]
 
- <Exception encountered during context initialization - cancelling refresh 
attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: 
Error creating bean with name 'casReportsConfiguration': Unsatisfied 
dependency expressed through field 'cas3ServiceSuccessView'; nested 
exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'casValidationConfiguration': Unsatisfied 
dependency expressed through field 'centralAuthenticationService'; nested 
exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'casCoreConfiguration': Unsatisfied dependency 
expressed through field 'logoutManager'; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'logoutManager' defined in class path resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[com.openbet.cas.logout.OBLogoutManagerImpl]: Factory method 
'logoutManager' threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'realLogoutManager' defined in class path resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.LogoutManager]: Factory method 'realLogoutManager' 
threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'singleLogoutServiceMessageHandler' defined in class path 
resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.SingleLogoutServiceMessageHandler]: Factory method 
'singleLogoutServiceMessageHandler' threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'singleLogoutServiceLogoutUrlBuilder' defined in class path 
resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.SingleLogoutServiceLogoutUrlBuilder]: Factory method 
'singleLogoutServiceLogoutUrlBuilder' threw exception; nested exception is 
java.lang.ClassCastException: 
org.apereo.cas.web.SimpleUrlValidatorFactoryBean$$EnhancerBySpringCGLIB$$ba7be36f
 
cannot be cast to org.apereo.cas.web.UrlValidator>
May 23, 2018 2:59:06 PM org.apache.catalina.core.ContainerBase 
addChildInternal
SEVERE: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component 
[StandardEngine[Catalina].StandardHost[localhost].StandardContext[/cas]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167)
at 
org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:754)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:730)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734)
at 
org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1140)
at 
org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1874)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Caused by: 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'casReportsConfiguration': Unsatisfied dependency 
expressed through field 'cas3ServiceSuccessView'; nested exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'casValidationConfiguration': Unsatisfied 
dependency expressed through field 'centralAuthenticationService'; nested 
exception is 
org.springframework.beans.factory.UnsatisfiedDependencyException: Error 
creating bean with name 'casCoreConfiguration': Unsatisfied dependency 
expressed through field 'logoutManager'; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'logoutManager' defined in class path resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[com.openbet.cas.logout.OBLogoutManagerImpl]: Factory method 
'logoutManager' threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'realLogoutManager' defined in class path resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.LogoutManager]: Factory method 'realLogoutManager' 
threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'singleLogoutServiceMessageHandler' defined in class path 
resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.SingleLogoutServiceMessageHandler]: Factory method 
'singleLogoutServiceMessageHandler' threw exception; nested exception is 
org.springframework.beans.factory.BeanCreationException: Error creating 
bean with name 'singleLogoutServiceLogoutUrlBuilder' defined in class path 
resource 
[com/openbet/cas/logout/config/OpenbetLogoutManagerConfiguration.class]: 
Bean instantiation via factory method failed; nested exception is 
org.springframework.beans.BeanInstantiationException: Failed to instantiate 
[org.apereo.cas.logout.SingleLogoutServiceLogoutUrlBuilder]: Factory method 
'singleLogoutServiceLogoutUrlBuilder' threw exception; nested exception is 
java.lang.ClassCastException: 
org.apereo.cas.web.SimpleUrlValidatorFactoryBean$$EnhancerBySpringCGLIB$$ba7be36f
 
cannot be cast to org.apereo.cas.web.UrlValidator
at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at 
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at 
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1268)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at 
org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:372)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1177)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1071)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
at 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
at 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
at 
org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
at 
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
at 
org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:154)
at 
org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:134)
at 
org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:87)
at 
org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169)
at 
org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5229)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 10 more



The problem is I am not referring to the SimpleUrlValidatorFactoryBean 
method at all. I am not sure how to fix this cast exception.

I have attached the relevant code in files. Any help would be appresiated. 

If there is other way to achive this pelase let me know.

-- 
- Website: https://apereo.github.io/cas
- Gitter Chatroom: https://gitter.im/apereo/cas
- List Guidelines: https://goo.gl/1VRrw7
- Contributions: https://goo.gl/mh7qDG
--- 
You received this message because you are subscribed to the Google Groups "CAS 
Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/a/apereo.org/d/msgid/cas-user/7d306068-3057-4749-be76-356379a72b5b%40apereo.org.
package com.openbet.cas.logout.config;

import com.openbet.cas.logout.CustomLogoutHandler;
import com.openbet.cas.logout.CustomLogoutManagerImpl;
import org.apache.commons.validator.routines.DomainValidator;
import org.apereo.cas.authentication.AuthenticationServiceSelectionPlan;
import org.apereo.cas.authentication.DefaultAuthenticationServiceSelectionPlan;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.logout.*;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.util.http.HttpClient;
import org.apereo.cas.util.http.SimpleHttpClientFactoryBean;
import org.apereo.cas.web.UrlValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration("CustomLogoutManagerConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
public class CustomLogoutManagerConfiguration implements LogoutExecutionPlanConfigurer {
	private static final Logger LOGGER = LoggerFactory.getLogger(CustomLogoutManagerConfiguration.class);

	@Override
	public void configureLogoutExecutionPlan(LogoutExecutionPlan plan) {
		plan.registerLogoutHandler(CustomLogoutHandler());
	}

	@Bean
	public LogoutHandler CustomLogoutHandler() {
		CustomLogoutHandler handler = null;
		handler = new CustomLogoutHandler(logoutManager());

		LOGGER.info("Openbet custom logout configuration");
		return handler;
	}

	@Bean CustomLogoutManagerImpl logoutManager(){
		return new CustomLogoutManagerImpl(realLogoutManager());
	}

	@Bean
	LogoutManager realLogoutManager(){
		return new DefaultLogoutManager(logoutMessageCreator(),
				singleLogoutServiceMessageHandler(),false, logoutExecutionPlan());
	}

	@Bean
	LogoutMessageCreator logoutMessageCreator() {
		return new LogoutMessageCreator() {
			@Override public String create(LogoutRequest logoutRequest) {
				return "Logout Successful";
			}
		};
	}

	@Bean
	SingleLogoutServiceMessageHandler singleLogoutServiceMessageHandler() {
		return new DefaultSingleLogoutServiceMessageHandler(httpClient(), logoutMessageCreator(),
				servicesManager, singleLogoutServiceLogoutUrlBuilder(),true, authenticationServiceSelectionPlan());
	}

	@Bean
	LogoutExecutionPlan logoutExecutionPlan(){
		return new DefaultLogoutExecutionPlan();
	}

	@Bean
	HttpClient httpClient(){
		return new SimpleHttpClientFactoryBean().getObject();
	}

	@Autowired
	@Qualifier("servicesManager")
	private
	ServicesManager servicesManager;

	@Bean
	SingleLogoutServiceLogoutUrlBuilder singleLogoutServiceLogoutUrlBuilder(){
		return new DefaultSingleLogoutServiceLogoutUrlBuilder(urlValidator());
	}

	@Bean
	UrlValidator urlValidator() {
		return new UrlValidator(){
			@Override public boolean isValid(String s) {
				return org.apache.commons.validator.routines.UrlValidator.getInstance().isValid(s);
			}

			@Override public boolean isValidDomain(String s) {
				return DomainValidator.getInstance().isValid(s);
			}
		};

//		new SimpleUrlValidator(org.apache.commons.validator.routines.UrlValidator.getInstance(), DomainValidator.getInstance());
//		return new SimpleUrlValidator.getInstance();
	}

	@Bean
	AuthenticationServiceSelectionPlan authenticationServiceSelectionPlan(){
		return new DefaultAuthenticationServiceSelectionPlan();
	}
}
package com.openbet.cas.logout;

import org.apereo.cas.logout.LogoutHandler;
import org.apereo.cas.ticket.TicketGrantingTicket;

public class CustomLogoutHandler implements LogoutHandler {

	final private CustomLogoutManagerImpl theRealLogoutManager;

	public CustomLogoutHandler(CustomLogoutManagerImpl logoutManager) {
		this.theRealLogoutManager = logoutManager;
	}

	@Override
	public int getOrder(){
		return 1;
	}

	@Override
	public void handle(TicketGrantingTicket ticketGrantingTicket) {
		theRealLogoutManager.performLogout(ticketGrantingTicket);
	}
}
package com.openbet.cas.logout;

import org.apereo.cas.authentication.principal.Principal;
import org.apereo.cas.logout.LogoutManager;
import org.apereo.cas.logout.LogoutRequest;
import org.apereo.cas.ticket.TicketGrantingTicket;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

public class CustomLogoutManagerImpl implements LogoutManager {

	/** The logger. */
	private static final Logger LOGGER = LoggerFactory.getLogger(CustomLogoutManagerImpl.class);

	/** the Real Thing (TM) */
	final private LogoutManager theRealLogoutManager;

	public CustomLogoutManagerImpl(LogoutManager theRealLogoutManager) {
		this.theRealLogoutManager = theRealLogoutManager;
	}

	@Override
	public List<LogoutRequest> performLogout(TicketGrantingTicket ticket) {
		Principal p = ticket.getAuthentication().getPrincipal();
		//Do my own stuff here
		//Mark the user as logged out from the database.
		return theRealLogoutManager.performLogout(ticket);
	}

	@Override
	public String createFrontChannelLogoutMessage(LogoutRequest logoutRequest) {
		LOGGER.info("### createFrontChannelLogoutMessage");
		// TODO Auto-generated method stub
		return theRealLogoutManager.createFrontChannelLogoutMessage(logoutRequest);
	}

}

Reply via email to