Spring security + vratpor 3.3.1

30 respostas
foxpv

Pessoal,

Alguém sabe a melhor forma de configurar o spring security numa app com vraptor 3.3.1?

O applicationContext fica no classpath, até aí beleza, quando coloco o filter do security ele reclama que não foi declarado o contextListener do spring. Mas eu não preciso declarar porque o listener no vraptor já faz o trabalho né?

Então, alguém sabe como saio dessa sinuca?

[]'s

30 Respostas

Lucas_Cavalcanti

tenta o seguinte, coloque o listener do spring ( o context, não o request ), apontando pro applicationContext.xml do classpath. Teoricamente o VRaptor deve usá-lo para registrá-lo seus componentes.

O que pode acontecer é ele inicializar os beans singleton declarados no applicationContext.xml duas vezes (mas vai inicializar, destruir e criar outro, não vão ficar dois)

foxpv

Lucas,

Quando eu tento do jeito que vc falou parece que dá problema na hora de iniciar o ResourceHandler do vraptor:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stereotypeHandler' defined in URL [jar:file:/Applications/apache-tomcat-7.0.19/webapps/Cliente/WEB-INF/lib/vraptor-3.3.1.jar!/br/com/caelum/vraptor/ioc/ResourceHandler.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.caelum.vraptor.ioc.ResourceHandler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: br.com.caelum.vraptor.ioc.ResourceHandler.<init>()
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:965)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:911)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
	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.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:580)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425)
	at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:276)
	at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:197)
	at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47)
	at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
	at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
	at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
	at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
	at java.util.concurrent.FutureTask.run(FutureTask.java:138)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:680)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.caelum.vraptor.ioc.ResourceHandler]: No default constructor found; nested exception is java.lang.NoSuchMethodException: br.com.caelum.vraptor.ioc.ResourceHandler.<init>()
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:70)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:958)
	... 21 more
Caused by: java.lang.NoSuchMethodException: br.com.caelum.vraptor.ioc.ResourceHandler.<init>()
	at java.lang.Class.getConstructor0(Class.java:2706)
	at java.lang.Class.getDeclaredConstructor(Class.java:1985)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:65)
	... 22 more
Lucas_Cavalcanti

estranho, ele tá forçando que o bean esteja com construtor padrão…

qual versão do spring vc tá usando?

foxpv

3.0.5

Lucas_Cavalcanti

qual listener do spring vc colocou?

foxpv

ContextLoaderListener

<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</context-param>
Lucas_Cavalcanti

se vc tira o applicationContext.xml a aplicação sobe normalmente?

se vc tira o filtro do spring security a aplicação sobe normalmente?

foxpv

se eu tiro o filtro do spring (o contextListener) e deixo o filtro do spring security, ela sobe normalmente. Se eu tiro o filtro do spring security e deixo do do spring (contextListener), dá pau.

Lucas_Cavalcanti

só que sem o filtro do contextListener o filtro do spring security não funciona, certo?

foxpv

Complementando:

Se eu somente tiro o applicationContext ele lança um esperado

Caused by: java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
foxpv

Correto!

Lucas_Cavalcanti

em que momento dá pau? na subida do servidor?

foxpv

O pau do ResourceHandler?

Sim, na subida do servidor.

Lucas_Cavalcanti

não, o pau do filtro do security sem o listener?

foxpv

aí dá pau durante cada requisição, mas ele sai do filter sem retornar erro 500 e a requisição é processada até o final (sem aplicar as regras do spring security obviamente).

yorgan

Eu utilizei o Spring Security + VRaptor dessa forma:
http://dkist.me/blog/2010/09/spring-security/

[]'s
Daniel

foxpv

yorgan,

Já até tinha visto seu post, e é exatamente isso que estou tentando fazer, mas tá dando pau.

Lucas_Cavalcanti

tenta atualizar pro vraptor 3.4, e deixar o context listener

foxpv

Lucas, desculpa a demora, acabei dormindo.

Atualizei pro vraptor 3.4 e continua dando o mesmo problema com o ResourceHandler.

foxpv

Estava cogitando mudar pra versão mais nova do spring mas acho que não faz sentido visto que a última versão é a 3.0.6 e eu estou usando a 3.0.5.

Lucas_Cavalcanti

então… teoricamente deveria funcionar… vc já fez o teste de deixar só o contextListener e um applicationContext.xml vazio?

foxpv

Só com o contextListener e o applicationContext vazio subiu!

foxpv

Quando eu faço as declarações do security no applicationContext dá o erro

<!-- SPRING SECURITY -->
	<security:http auto-config="true">
		<security:intercept-url pattern="/**" access="ROLE_USER" />
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
				<security:user name="bob" password="bobspassword" authorities="ROLE_USER" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
Lucas_Cavalcanti

então é algo que vc colocou no applicationContext.xml

posta ele aqui por favor

Lucas_Cavalcanti

estranho… ele tá se metendo na criação dos componentes da aplicação, não deveria.

vc colocou as restrições do mesmo jeito que está no blog do daniel?

foxpv

applicationContext completo:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:security="http://www.springframework.org/schema/security"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd
         http://www.springframework.org/schema/tx
         http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
         http://www.springframework.org/schema/security
         http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"
	default-lazy-init="false">

	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
		<property name="persistenceUnitName" value="bdApetiteWeb" />
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>

	<tx:annotation-driven transaction-manager="transactionManager" />

	<context:component-scan base-package="br.com" />

	<!-- SPRING SECURITY -->
	<security:http auto-config="true">
		<security:intercept-url pattern="/**" access="ROLE_USER" />
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider>
			<security:user-service>
				<security:user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
				<security:user name="bob" password="bobspassword" authorities="ROLE_USER" />
			</security:user-service>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>
foxpv

é a configuração mais básica de segurança, nem to usando um userService que busca usuários do banco.

Lucas_Cavalcanti
<context:component-scan base-package="br.com" />

deixe esse pacote mais específico, senão ele pega componentes do VRaptor também, e acho que é por isso o problema

foxpv

Hum, bem pensado, era isso mesmo.

Aí ele estava tentando carregar todos os beans do vraptor, e como não tinha nada especificado, ele estava tentando chamar o construtor padrão certo?

Lucas_Cavalcanti

yep,

o ResourceHandler tem um @Component do spring em cima dele, pq ele implementa uma interface que é recebida em outro lugar como uma lista…

e se não tem @Autowired no construtor o spring não o usa por padrão.

Criado 7 de novembro de 2011
Ultima resposta 8 de nov. de 2011
Respostas 30
Participantes 3