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 cas-user+unsubscr...@apereo.org.
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