11 octubre 2010

Desplegar una aplicación de grails que usa el Jasig CAS support for the Spring Security plugin

A veces el uso de nuevas tecnologías implica una extensa investigación para la resolución de problemas, ejemplo el deploy de una aplicación Grail 1.3.x en Glassfish. Esta ocasión quiero escribir un consejo para aquellos que estén usando Jasig CAS support for the Spring Security plugin y deseen desplegar su app en un serverlet container o bien un servidor de aplicaciones como lo es GlassFish. ¿Por qué hay necesidad de hacer esto?, principalmente por un bug que existe al momento del despliegue y en el proceso de creación del bean "casServiceProperties". El mensaje de error que aparecerá es similar a este:

2010-07-23 16:00:22,061 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] ERROR StackTrace  - Sanitizing stacktrace: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'casServiceProperties': Initialization of bean failed; nested exception is org.springframework.beans.ConversionNotSupportedException: Failed to convert property value of type 'groovy.util.ConfigObject' to required type 'java.lang.String' for property 'artifactParameter'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [groovy.util.ConfigObject] to required type [java.lang.String] for property 'artifactParameter': no matching editors or conversion strategy found at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) 
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:135) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:322) 
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:106) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1317) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1076) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
at org.codehaus.groovy.grails.commons.spring.ReloadAwareAutowireCapableBeanFactory.doCreateBean(ReloadAwareAutowireCapableBeanFactory.java:135) 
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)

La forma más simple de solucionar esto (workaround) es declarar en el Config.groovy todas las posibles propiedades que necesita el plugin, esto quiere decir que debemos declarar todas las opciones que nos dice la documentación del plugin y el resultado será semejante a esto:

//Config for CAS server grails.plugins.springsecurity.cas.loginUri = '/login'
grails.plugins.springsecurity.cas.serverUrlPrefix = 'http://server:8080/casserver'
grails.plugins.springsecurity.cas.serviceUrl = 'http://localhost:8080/app/j_spring_cas_security_check' 
grails.plugins.springsecurity.cas.filterProcessesUrl = '/j_spring_cas_security_check' grails.plugins.springsecurity.cas.key = 'my_key' 
grails.plugins.springsecurity.cas.sendRenew = false 
grails.plugins.springsecurity.cas.artifactParameter = 'ticket' 
grails.plugins.springsecurity.cas.serviceParameter = 'service' 
grails.plugins.springsecurity.cas.useSingleSignout = true  
grails.plugins.springsecurity.cas.proxyCallbackUrl = null 
grails.plugins.springsecurity.cas.proxyReceptorUrl = null 
grails.plugins.springsecurity.logout.afterLogoutUrl = 'http://server:8080/casserver/logout?url=http://localhost:8080/app/'

Y con eso ya podremos desplegar nuestro WAR sin problemas en nuestro server.

No hay comentarios.:

Publicar un comentario