Minha contribuição - Controle de acesso VRaptor 3

Os métodos da @LoginPage e da @AccessDeniedPage não podem (obviamente), ter restrições.

Você baixou a última versão? Tá lá na 5ª página…

O accepts é utilizado para decidir se o interceptor vai ou não interceptar a chamada de um determinado método. Acho que não seja a causa do problema.

Não se esqueça de colocar o context parameter no seu web.xml, para que os componentes do jar possam ser injetados na tua aplicação:

	<context-param>
		<param-name>br.com.caelum.vraptor.packages</param-name>
		<param-value>br.com.bronx.vraptor.restrictrex</param-value>
	</context-param>

Teste aí e me diga o que rola.

Opa! Agora a aplicação respondeu, tava faltando a parte do web.xml.
Estou usando a versão 1.0.2 do restrictrex;
Tá dando erro 404 e mais esta saida do console:

SEVERE: Exception starting filter vraptor
br.com.bronx.vraptor.restrictrex.exception.PageException: Access denied page method cannot have parameters.
	at br.com.bronx.vraptor.restrictrex.startup.PageChecker.findPages(PageChecker.java:46)
	at br.com.bronx.vraptor.restrictrex.startup.PageHandler.handle(PageHandler.java:46)
	at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.handleRefresh(StereotypedBeansRegistrar.java:59)
	at br.com.caelum.vraptor.ioc.spring.StereotypedBeansRegistrar.onApplicationEvent(StereotypedBeansRegistrar.java:47)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:294)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:858)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:419)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.start(SpringBasedContainer.java:63)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.start(SpringProvider.java:75)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:107)
	at br.com.caelum.vraptor.VRaptor.init(VRaptor.java:100)
	at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:295)
	at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:422)
	at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:115)
	at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3838)
	at org.apache.catalina.core.StandardContext.start(StandardContext.java:4488)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
	at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:637)
	at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:563)
	at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:498)
	at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
	at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
	at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
	at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
	at org.apache.catalina.core.StandardService.start(StandardService.java:519)
	at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
10/04/2010 00:03:23 org.apache.catalina.core.StandardContext start
SEVERE: Error filterStart
10/04/2010 00:03:23 org.apache.catalina.core.StandardContext start
SEVERE: Context [/JMovie] startup failed due to previous errors
10/04/2010 00:03:23 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.

Até erro no driver do Postgre tá dando. =/

Os métodos referentes às páginas de login e acesso negado (anotados com @AccessDeniedPage e @LoginPage) não podem receber parâmetros.

br.com.bronx.vraptor.restrictrex.exception.PageException: Access denied page method cannot have parameters.  

Poste aí seu código caso haja dúvidas…

Estranho, só notei com @LoginPage o Login.

@Resource
public class LoginController {
	
	private UsuarioDAO usuarioDAO;
	private UsuarioLogado usuarioLogado;
	private Validator validator;
	private Result result; 
	
	
	public  LoginController(Result result, UsuarioLogado usuarioLogado, Validator validator) {  
			this.result = result;  
			this.usuarioLogado = usuarioLogado;  
			this.validator = validator;  
			}  
	
	
	@LoginPage
	@Path("/login")
	public void loginUsuario() {		
		if  (this.usuarioLogado.getPerfil().isLoggedIn())
			//caso o usuário já esteja logado, redirecione-o para a página principal  
		     this.result.redirectTo(IndexController.class).index();  		
	}	
	
	
	public LoginController(UsuarioDAO usuarioDAO, UsuarioLogado usuarioLogado, Result result){
	    this.usuarioDAO = usuarioDAO;
	    this.usuarioLogado = usuarioLogado;
	    this.result = result;
	}
	
	public void autentica(Usuario usuario) {	
		Usuario autenticado = usuarioDAO.buscaUsuarioPorLoginESenha(usuario);
		  if(usuarioDAO.existeUsuario(usuario)) {  			        
			this.validator.add(new ValidationMessage("Login já existe", "usuario.login"));  
			this.validator.onErrorUse(Results.logic()).redirectTo(LoginController.class).loginUsuario();  
		} else /*usuário encontrado*/{  
			usuarioLogado.efetuaLogin(autenticado);
			this.usuarioLogado.setUsuarioLogado(usuario);//guardo o usuário na sessão  
			this.result.redirectTo(HomeController.class).home();//redireciono para a página principal  
	    } 	
		  result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();   
	    
	}
	
	public void logout() {  
		this.usuarioLogado.setUsuarioLogado(null);		
		  result.redirectTo(IndexController.class).index();		 		
	} 
}
@Intercepts
public class AccesControllerInterceptor implements Interceptor {
	
	
	private RestrictionChecker restrictionChecker;
	private Result result;
	private UsuarioLogado usuarioLogado;
	
	
	public AccesControllerInterceptor(UsuarioLogado usuarioLogado, RestrictionChecker restrictionChecker, Result result) {
		this.result = result;
		this.restrictionChecker = restrictionChecker;
		this.usuarioLogado = usuarioLogado;
	}
	
	public boolean accepts(ResourceMethod method) {
		return this.restrictionChecker.hasRestriction(method.getMethod());
	}

	
	public void intercept(InterceptorStack stack, ResourceMethod resourceMethod,
	    Object resourceInstance) throws InterceptionException {
		RestrictionResult restrictionResult;
		//this.restrictionChecker.setDefaultAccessDeniedPage("/filme");
		this.restrictionChecker.setDefaultLoginPage("/login");
		
		try {
			restrictionResult = this.restrictionChecker.checkRestrictions(resourceMethod.getMethod(), this.usuarioLogado.getPerfil());
		} catch (RestrictionAnnotationException exception) {
			throw new InterceptionException(exception);
		} catch (DestinationException exception) {
			throw new InterceptionException(exception);
		}
		if (restrictionResult.isRestricted()){
			if (restrictionResult.isHttp403()) {
				this.result.use(Results.http()).sendError(403);
			} else {
				this.result.use(Results.page()).redirect(restrictionResult.getDestination());
			}
		} else {
			stack.next(resourceMethod, resourceInstance);
		}
	}
	
}

Era para abri a Index, lá do IndexController, que está assim:

@Path("/index")	
	public void index() {		
	}	

Cara, tem certeza que não anotou nenhum método com a annotation @AccessDeniedPage??

Essa exceção só é lançada caso algum método dentro de algum recurso (classe anotada com @Resource) possua a annotation @AccessDeniedPage e possua parâmetros.

Dá uma olhada nos seus outros controllers para ver se vc deixou algum método com essa annotation.

No outro post vc setou o path “/filmes” como accessDeniedPage. Dê uma olhada no respectivo método para ver se a annotation não está lá.

Caso nenhum método esteja anotado com ela, aí corre o risco de haver um bug no meu código.

Faça essa verificação.

Te mandei uma mensagem pessoal com meu msn. Me add lá.

Abs.

Opa, só agora vi sua mensagem, vou te adicionar!

Acessou a index, era a anotação @AccesDeniedPage mesmo. =/

Agora o erro é no construtor do login:

10/04/2010 00:43:17 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'loginController' defined in file [/home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps/JMovie/WEB-INF/classes/br/com/bruno/jmovie/controller/LoginController.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.bruno.jmovie.controller.LoginController]: No default constructor found; nested exception is java.lang.NoSuchMethodException: br.com.bruno.jmovie.controller.LoginController.<init>()
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:946)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:890)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:479)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:328)
	at org.springframework.web.context.request.AbstractRequestAttributesScope.get(AbstractRequestAttributesScope.java:43)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:385)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:375)
	at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1069)
	at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:221)
	at br.com.caelum.vraptor.ioc.spring.VRaptorApplicationContext.getBean(VRaptorApplicationContext.java:240)
	at br.com.caelum.vraptor.ioc.spring.SpringBasedContainer.instanceFor(SpringBasedContainer.java:58)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:41)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [br.com.bruno.jmovie.controller.LoginController]: No default constructor found; nested exception is java.lang.NoSuchMethodException: br.com.bruno.jmovie.controller.LoginController.<init>()
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:69)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:938)
	... 43 more
Caused by: java.lang.NoSuchMethodException: br.com.bruno.jmovie.controller.LoginController.<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:64)
	... 44 more

Conseguiu ver algo errado lá no LoginController?

Valeu!!

A exception está dizendo que a classe não possui o construtor padrão (sem parâmetros):

(...)No default  constructor found; nested exception is java.lang.NoSuchMethodException: br.com.bruno.jmovie.controller.LoginController.<init>()  (...)

Mas isso não deveria ocorrer.

Crie aí um construtor padrão para ver o que acontece

Sinistro…!

tenta colocar a anotação @Autowired no construtor (antes de criar o construtor padrão)

se não funcionar, vc vai precisar trocar por injeção via setter…

de qqer forma, esse erro não deveria acontecer, a menos que vc esteja usando algo específico do spring (como o Spring AOP, Spring security, etc)

Deu certo Lucas!
Mandei a anotação no construtor:

@Autowired
	public  LoginController(Result result, UsuarioLogado usuarioLogado, Validator validator) {  
			this.result = result;  
			this.usuarioLogado = usuarioLogado;  
			this.validator = validator;  
			}  

Abriu a Index, depois acessei a página de Login e ao digitar usuario e senha tenho este erro:

01:41:57,211 DEBUG [OgnlParametersProvider] Applying usuario.login with [admin]
01:41:57,272 DEBUG [OgnlParametersProvider] Applying usuario.senha with [admin]
01:41:57,280 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.LoginController.autentica(br.com.bruno.jmovie.model.Usuario) as [usuario]
01:41:57,280 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.autentica} are [br.com.bruno.jmovie.model.Usuario@1cee792]
10/04/2010 01:41:57 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.NullPointerException
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:77)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:42)
	at br.com.caelum.vraptor.core.InstantiatedInterceptorHandler.execute(InstantiatedInterceptorHandler.java:41)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.InterceptorListPriorToExecutionExtractor.intercept(InterceptorListPriorToExecutionExtractor.java:46)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:80)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:67)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:46)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:48)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:59)
	at br.com.caelum.vraptor.core.DefaultRequestExecution.execute(DefaultRequestExecution.java:62)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:91)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:55)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:88)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NullPointerException
	at br.com.bruno.jmovie.controller.LoginController.autentica(LoginController.java:49)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:50)
	... 37 more
10/04/2010 01:42:04 org.apache.coyote.http11.Http11Protocol pause
INFO: Pausing Coyote HTTP/1.1 on http-8080
10/04/2010 01:42:05 org.apache.catalina.core.StandardService stop
INFO: Stopping service Catalina
01:42:05,741  INFO [VRaptorApplicationContext] Closing Root WebApplicationContext: startup date [Sat Apr 10 01:41:42 BRT 2010]; root of context hierarchy
10/04/2010 01:42:05 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: A web application registered the JBDC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

Tava analisando com o Bronx este método:

public Usuario buscaUsuarioPorLoginESenha(Usuario usuario) {
	    Query query = this.session.
	    createQuery("from Usuario where login = :pLogin and senha = :pSenha");
	    query.setParameter("pLogin", usuario.getLogin());
	    query.setParameter("pSenha", usuario.getSenha());
	    return (Usuario) query.uniqueResult();
	}
	

São das classes da apostila da Caelum, não vislumbrei onde poderia estar dando conflito.

Abraço!!!

a nullpointer é na linha 49 do loginController:

 Caused by: java.lang.NullPointerException  
     at br.com.bruno.jmovie.controller.LoginController.autentica(LoginController.java:49)

vê se tem algo lá q não foi inicializado

É, não sei mais onde pode estar o erro, conferi os métodos e estão corretos, são os mesmos que estava usando antes:

Form de login:

<form method="post" action="login/autentica" />    
    Login: <input type="text" name="usuario.login" /><br/>  
    Senha: <input type="password" name="usuario.senha" /><br/>  
            <input type="submit" value="Autenticar" />    
</form>  

Removi a taglib na action pra deixar como estava antes, não deu certo.

Método LoginController:

public void autentica(Usuario usuario) {
		
Usuario autenticado = usuarioDAO.buscaUsuarioPorLoginESenha(usuario);
    if(autenticado != null) {
	  usuarioLogado.efetuaLogin(autenticado);
	  this.usuarioLogado.setUsuarioLogado(usuario);//guardo o usuário na sessão
	  result.use(Results.logic()).redirectTo(HomeController.class).home();
	  return;
      }
	  result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();
}

Acrescentei o return dentro do if(), e removi o validator para não interferir em nada, tb não resolveu.

Método buscaPorLoginESenha da classe UsuarioDAO:

public Usuario buscaUsuarioPorLoginESenha(Usuario usuario) {
	    Query query = this.session.
	    createQuery("from usuario where login = :pLogin and senha = :pSenha");
	    query.setParameter("pLogin", usuario.getLogin());
	    query.setParameter("pSenha", usuario.getSenha());
	    return (Usuario) query.uniqueResult();
	}

Nem encostei nessa classe.

Classe UsuarioLogado:

package br.com.bruno.jmovie.component;

import java.util.ArrayList;
import java.util.List;

import br.com.bruno.jmovie.model.Perfil;
import br.com.bruno.jmovie.model.Usuario;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.SessionScoped;

@Component
@SessionScoped
public class UsuarioLogado implements java.io.Serializable  {
	
	private static final long serialVersionUID = 1L;
	
		private Usuario usuarioLogado;
	     
	     public void efetuaLogin(Usuario usuario) {
	         this.usuarioLogado = usuario;
	     }
	     public Usuario getUsuario() {
	         return this.usuarioLogado;
	     }
	     
	     public void logout() {  
	         this.usuarioLogado = null;  
	    }  
	    	             
	    public boolean isLogged() {  
	    	 return usuarioLogado != null;  
	    }
	    public String getNome() {
	        return usuarioLogado.getNome();
	    }
		public void setUsuarioLogado(Usuario usuarioLogado) {
			this.usuarioLogado = usuarioLogado;
		}
		public Usuario getUsuarioLogado() {  
	    	 return this.usuarioLogado;  
	    }  
	    
	     public Perfil getPerfil() {  
	        Perfil perfil = new Perfil();  
	    	if (this.usuarioLogado != null) {  
	    	    perfil.setLoggedIn(true);
	    	    
	    	 List<String> roles = new ArrayList<String>();  
	    	     roles.add(this.usuarioLogado.getRole());  
	    	     perfil.setRoles(roles); 
	    	}
	    	 return perfil; 
	     }

	 }

Já tinha todos os métodos, apenas acrescentei o de pegar perfil e o de listar os roles.

Classe AccesControllerInterceptor:

package br.com.bruno.jmovie.interceptor;

import br.com.bronx.vraptor.restrictrex.exception.DestinationException;
import br.com.bronx.vraptor.restrictrex.exception.RestrictionAnnotationException;
import br.com.bronx.vraptor.restrictrex.restriction.RestrictionChecker;
import br.com.bronx.vraptor.restrictrex.restriction.RestrictionResult;
import br.com.bruno.jmovie.component.UsuarioLogado;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
import br.com.caelum.vraptor.view.Results;

@Intercepts
public class AccesControllerInterceptor implements Interceptor {
	
	
	private RestrictionChecker restrictionChecker;
	private Result result;
	private UsuarioLogado usuarioLogado;
	
	
	public AccesControllerInterceptor(UsuarioLogado usuarioLogado, RestrictionChecker restrictionChecker, Result result) {
		this.result = result;
		this.restrictionChecker = restrictionChecker;
		this.usuarioLogado = usuarioLogado;
	}
	
	public boolean accepts(ResourceMethod method) {
		return this.restrictionChecker.hasRestriction(method.getMethod());
	}

	
	public void intercept(InterceptorStack stack, ResourceMethod resourceMethod,
	    Object resourceInstance) throws InterceptionException {
		RestrictionResult restrictionResult;
		//this.restrictionChecker.setDefaultAccessDeniedPage("/filme");
		//this.restrictionChecker.setDefaultLoginPage("/login");
		
		try {
			restrictionResult = this.restrictionChecker.checkRestrictions(resourceMethod.getMethod(), this.usuarioLogado.getPerfil());
		} catch (RestrictionAnnotationException exception) {
			throw new InterceptionException(exception);
		} catch (DestinationException exception) {
			throw new InterceptionException(exception);
		}
		if (restrictionResult.isRestricted()){
			if (restrictionResult.isHttp403()) {
				this.result.use(Results.http()).sendError(403);
			} else {
				this.result.use(Results.page()).redirect(restrictionResult.getDestination());
			}
		} else {
			stack.next(resourceMethod, resourceInstance);
		}
	}
	
}

Deixei como postado aqui, apenas coloquei o usuarioLogado.getPerfil() na linha de checkRestrictions.

O erro é o mesmo, NullPointerException na linha 49 que é onde busca o usuário por login e senha. O usuário está cadastrado no banco e estou informando corretamente.

Alguma idéia?

Abraço pessoal!!

será q não tem algum motivo pro restrictionResult vir null? por exemplo o usuário não ter restrições?

se sim, é só adicionar outra condição no if… se isso for null vc faz o stack.next ou dá algum erro

Coloquei o código numa estrutura try/catch :

public void autentica(Usuario usuario, ResourceMethod resourceMethod, Validator validator,Object resourceInstance)
	throws InterceptionException{		
		try {
		Usuario autenticado = usuarioDAO.buscaUsuarioPorLoginESenha(usuario);
	    if(autenticado != null) {
	        usuarioLogado.efetuaLogin(autenticado);
	        this.usuarioLogado.setUsuarioLogado(usuario);//guardo o usuário na sessão
	        result.use(Results.logic()).redirectTo(HomeController.class).home();
	        return;
	    } else {
	    	 this.validator.add(new ValidationMessage("usuario.login", "login.obrigatorio"));
	    	 result.use(Results.logic()).redirectTo(LoginController.class).loginUsuario();
	    }
		} catch(Exception e) {
			//throw new InterceptionException(e.getMessage());
			
		} finally {
	    result.use(Results.logic()).redirectTo(HomeController.class).home();
	    
		}

Ficou uma coisa bizonha, redireciona para a Home, que seria a página após o login correto, porém informa que o usuário não está logado.

Este é o trecho que informa se o usuário está logado ou não:

<c:if test="${usuarioLogado.logged}">
    	Olá, ${usuarioLogado.nome }! <a href="<c:url value="/login/logout"/>">Logout</a>
		</c:if>
		<c:if test="${empty usuarioLogado or not usuarioLogado.logged}">
    	Você não está logado. <a href="<c:url value="/login"/>">Login</a>
    	<a href="<c:url value="/usuario"/>">Cadastre-se</a>
		</c:if>

Fica valendo o método isLogged() da classe UsuarioLogado ou tenho que usar outro método?

Esta é a saida:

16:40:38,088 DEBUG [DefaultResourceTranslator] trying to access /
16:40:38,101 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.com.caelum.vraptor.blank.IndexController.index}
16:40:38,352 DEBUG [AsmBasedTypeCreator ] Trying to make class for IndexController$index$715134878$2
16:40:38,353 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.caelum.vraptor.blank.IndexController.index() as []
16:40:38,353 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: []
16:40:38,354 DEBUG [AsmBasedTypeCreator ] Methods: []
16:40:38,354 DEBUG [AsmBasedTypeCreator ] Fields: []
16:40:38,354 DEBUG [CacheBasedTypeCreator] cached generic type for method {DefaultResourceMethod: br.com.caelum.vraptor.blank.IndexController.index}
16:40:38,375 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.caelum.vraptor.blank.IndexController.index() as []
16:40:38,375 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.caelum.vraptor.blank.IndexController.index} are []
16:40:38,490 DEBUG [DefaultStaticContentHandler] deferring URI to container: /JMovie/WEB-INF/jsp/index/index.jsp
16:40:40,407 DEBUG [DefaultResourceTranslator] trying to access /login
16:40:40,408 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.loginUsuario}
16:40:40,448 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.LoginController.loginUsuario() as []
16:40:40,448 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.loginUsuario} are []
16:40:40,485 DEBUG [DefaultStaticContentHandler] deferring URI to container: /JMovie/WEB-INF/jsp/login/loginUsuario.jsp
16:40:44,435 DEBUG [DefaultResourceTranslator] trying to access /login/autentica
16:40:44,436 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.autentica}
16:40:44,465 DEBUG [AsmBasedTypeCreator ] Trying to make class for LoginController$autentica$1161572748$3
16:40:44,466 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.LoginController.autentica(br.com.bruno.jmovie.model.Usuario,br.com.caelum.vraptor.resource.ResourceMethod,br.com.caelum.vraptor.Validator,java.lang.Object) throws br.com.caelum.vraptor.InterceptionException as [usuario, resourceMethod, validator, resourceInstance]
16:40:44,468 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: [Usuario, ResourceMethod, Validator, ResourceInstance]
16:40:44,468 DEBUG [AsmBasedTypeCreator ] Method for field 'Usuario' being defined for type Lbr/com/bruno/jmovie/model/Usuario;
16:40:44,469 DEBUG [AsmBasedTypeCreator ] Method for field 'ResourceMethod' being defined for type Lbr/com/caelum/vraptor/resource/ResourceMethod;
16:40:44,470 DEBUG [AsmBasedTypeCreator ] Method for field 'Validator' being defined for type Lbr/com/caelum/vraptor/Validator;
16:40:44,470 DEBUG [AsmBasedTypeCreator ] Method for field 'ResourceInstance' being defined for type Ljava/lang/Object;
16:40:44,472 DEBUG [AsmBasedTypeCreator ] Methods: [public br.com.bruno.jmovie.model.Usuario LoginController$autentica$1161572748$3.getUsuario(), public br.com.caelum.vraptor.resource.ResourceMethod LoginController$autentica$1161572748$3.getResourceMethod(), public void LoginController$autentica$1161572748$3.setResourceMethod(br.com.caelum.vraptor.resource.ResourceMethod), public void LoginController$autentica$1161572748$3.setUsuario(br.com.bruno.jmovie.model.Usuario), public void LoginController$autentica$1161572748$3.setValidator(br.com.caelum.vraptor.Validator), public br.com.caelum.vraptor.Validator LoginController$autentica$1161572748$3.getValidator(), public void LoginController$autentica$1161572748$3.setResourceInstance(java.lang.Object), public java.lang.Object LoginController$autentica$1161572748$3.getResourceInstance()]
16:40:44,473 DEBUG [AsmBasedTypeCreator ] Fields: [private br.com.bruno.jmovie.model.Usuario LoginController$autentica$1161572748$3.Usuario_, private br.com.caelum.vraptor.resource.ResourceMethod LoginController$autentica$1161572748$3.ResourceMethod_, private br.com.caelum.vraptor.Validator LoginController$autentica$1161572748$3.Validator_, private java.lang.Object LoginController$autentica$1161572748$3.ResourceInstance_]
16:40:44,473 DEBUG [CacheBasedTypeCreator] cached generic type for method {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.autentica}
16:40:44,473 DEBUG [OgnlParametersProvider] Applying usuario.login with [admin]
16:40:44,528 DEBUG [OgnlParametersProvider] Applying usuario.senha with [admin]
16:40:44,529 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.LoginController.autentica(br.com.bruno.jmovie.model.Usuario,br.com.caelum.vraptor.resource.ResourceMethod,br.com.caelum.vraptor.Validator,java.lang.Object) throws br.com.caelum.vraptor.InterceptionException as [usuario, resourceMethod, validator, resourceInstance]
16:40:44,530 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.autentica} are [br.com.bruno.jmovie.model.Usuario@1aa0a15, null, null, null]
16:40:44,751 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.HomeController.home() as []
16:40:44,752 DEBUG [AsmBasedTypeCreator ] Trying to make class for HomeController$home$84008057$4
16:40:44,752 DEBUG [ParanamerNameProvider] Found parameter names with paranamer for public void br.com.bruno.jmovie.controller.HomeController.home() as []
16:40:44,752 DEBUG [AsmBasedTypeCreator ] Parameter names found for creating type are: []
16:40:44,753 DEBUG [AsmBasedTypeCreator ] Methods: []
16:40:44,753 DEBUG [AsmBasedTypeCreator ] Fields: []
16:40:44,753 DEBUG [CacheBasedTypeCreator] cached generic type for method {DefaultResourceMethod: br.com.bruno.jmovie.controller.HomeController.home}
16:40:44,795 DEBUG [DefaultResourceTranslator] trying to access /home
16:40:44,795 DEBUG [DefaultResourceTranslator] found resource {DefaultResourceMethod: br.com.bruno.jmovie.controller.HomeController.home}
16:40:44,828 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.bruno.jmovie.controller.HomeController.home} are []
16:40:44,866 DEBUG [DefaultStaticContentHandler] deferring URI to container: /JMovie/WEB-INF/jsp/home/home.jsp

Nesta linha parece que está vindo td null, conforme o Lucas falou.

16:40:44,530 DEBUG [ParametersInstantiatorInterceptor] Parameter values for {DefaultResourceMethod: br.com.bruno.jmovie.controller.LoginController.autentica} are [br.com.bruno.jmovie.model.Usuario@1aa0a15, null, null, null]

E o certo seria apenas dois parâmetros, login e senha, ali parecem três parâmetros que estão vindo, não sei se estou certo.

Valeu!!!

Consegui resolver o problema me baseando no exemplo do Bronx, faltou no construtor do LoginController os parâmetros de UsuarioDAO, conforme abaixo:

@Autowired
	public  LoginController(Result result, UsuarioLogado usuarioLogado, Validator validator, UsuarioDAO usuarioDAO) {  
			this.result = result;  
			this.usuarioLogado = usuarioLogado; 
			this.validator = validator;
			this.usuarioDAO = usuarioDAO;
			}  

Agora o método autentica() funciona e está direcionando para a Home.

Ao direcionar para a Home não está mostrando o nome do usuário logado:

<c:choose>
		<c:when test="${usuarioLogado.usuarioLogado eq null}">
		Você não está logado. <a href="<c:url value="/login"/>">Fa&ccedil;a login</a>		
		</c:when>
		<c:otherwise>
		Ol&aacute;, ${usuarioLogado.nome }! <a href="<c:url value="/login/logout"/>">Logout</a>			
		</c:otherwise>
	</c:choose>

Estou pegando o nome lá no componente usuarioLogado, desta forma:

public String getNome() {
	        return usuarioLogado.getNome();
	    }

Na classe Usuario está:

public String getNome() {		
		return nome;
	}

Abraço!!

Para mostrar o nome do usuário logado na JSP usando o controlador de login é necessário usar EL com a estrutura Componente>Classe>Atributo, como a seguir:

Usando a taglib <c:choose>

<c:choose>
		<c:when test="${usuarioLogado.usuarioLogado eq null}">
		Você não está logado. <a href="<c:url value="/login"/>">Fa&ccedil;a login</a>		
		</c:when>
		<c:otherwise>
		Ol&aacute;, ${usuarioLogado.usuarioLogado.nome }! <a href="<c:url value="/login/logout"/>">Logout</a>			
		</c:otherwise>
</c:choose>

Ou usando a taglib <c:if test>

<c:if test="${usuarioLogado.usuarioLogado eq null}">
    	Você não está logado. <a href="<c:url value="/login"/>">Efetue Login</a>
</c:if> 	
<c:if test="${usuarioLogado.usuarioLogado != null}">
    	Olá, ${usuarioLogado.usuarioLogado.nome }! <a href="<c:url value="/login/logout"/>">Logout</a>
</c:if>

A expressão deveria mostrar o nome, mas NÃO mostra, me enganei ao editar o projeto, mas rodar outro que mostra o nome do usuário logado.

Abraço!

Bronx, parabéns pela iniciativa!!! :smiley:

já inclui em meu projeto e a configuração e as anotações estão bem simples de usar bacana!!!

Eu já li o tópico inteiro não sei se já perguntaram isso ou já deram essa sugestão mas ai vai!

Então eu criei o seguinte controller:

@LoggedIn
@Roles(roles = { "admin" })
@Resource
public class CategoriaController {

	public CategoriaController() {
	}
	
	public void list() {
		
	}
}

ai sem estar Logado tentei acessar a URI: “minhaapp/categoria/list” não acessou!!! Bingo funcionou, ai ele vai e me encaminha para o método que estiver anotado com @LoginPage. Porém depois que eu efetuo o meu login ele vai para o meu método de login “óbvio” ao invés de ir para URI que eu tinha tentado acessar…

ps: como eu faria para tipo salvar a URI q o usuário tentou acessar e se ele for efetuar o login leva-lo para lah após o login? tem como?

[]'s

é complexo, eu fiz na minha implementação… mas não foi tão simplis ^^ … infelismente não tive tempo de montar a página de documentação =/
mas farei muito em breve…

Obs.: não sei se o bronx fez a implementação…

Fala ai Bronx!
Estou com um probleminha aqui, saca so a saida do console:

INFO: Initializing Coyote HTTP/1.1 on http-8080
17/04/2010 16:38:01 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 927 ms
17/04/2010 16:38:02 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
17/04/2010 16:38:02 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.26
16:38:02,939  INFO [VRaptorApplicationContext] Refreshing Root WebApplicationContext: startup date [Sat Apr 17 16:38:02 BRT 2010]; root of context hierarchy
16:38:03,264  INFO [VRaptorApplicationContext] Scanning WEB-INF/classes: /home/bruno/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp2/wtpwebapps/Imobiliaria/WEB-INF/classes
16:38:03,488  INFO [VRaptorApplicationContext] Scanning packages from WEB-INF/classes and jars: [br.com.bronx.vraptor.restrictrex]
16:38:03,544  INFO [DefaultListableBeanFactory] Overriding bean definition for bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor': replacing [Root bean: class [org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [br.com.caelum.vraptor.ioc.spring.InjectionBeanPostProcessor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
16:38:03,923  INFO [DefaultListableBeanFactory] Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@147358f: defining beans [defaultTypeFinder,asmBasedTypeCreator,defaultTypeNameExtractor,defaultDeserializers,defaultAcceptHeaderToFormat,defaultInterceptorRegistry,defaultResourceNotFoundHandler,emptyElementsRemoval,pathAnnotationRoutesParser,defaultRouter,defaultMethodNotAllowedHandler,defaultConverters,defaultRoutes,encodingHandlerFactory,noRoutesConfiguration,XStreamXMLDeserializer,objenesisProxifier,defaultResourceTranslator,paranamerNameProvider,defaultMultipartConfig,stereotypeHandler,converterHandler,interceptorStereotypeHandler,deserializesHandler,stereotypedBeansRegistrar,defaultSpringLocator,defaultStatus,XStreamJSONSerialization,defaultValidator,outjectResult,defaultRepresentationResult,executeMethodInterceptor,defaultHttpResult,defaultRefererResult,downloadInterceptor,defaultPathResolver,deserializingInterceptor,applicationConfiguration,defaultResult,flashInterceptor,parametersInstantiatorInterceptor,replicatorOutjector,defaultMethodInfo,resourceLookupInterceptor,XStreamXMLSerialization,ognlParametersProvider,defaultFormatResolver,forwardToDefaultViewInterceptor,interceptorListPriorToExecutionExtractor,defaultLogicResult,defaultValidationViewsFactory,instantiateInterceptor,multipartInterceptor,emptyResult,defaultPageResult,jstlLocalization,bigDecimalConverter,bigIntegerConverter,booleanConverter,byteConverter,characterConverter,doubleConverter,enumConverter,floatConverter,integerConverter,localeBasedCalendarConverter,localeBasedDateConverter,longConverter,primitiveBooleanConverter,primitiveByteConverter,primitiveCharConverter,primitiveDoubleConverter,primitiveFloatConverter,primitiveIntConverter,primitiveLongConverter,primitiveShortConverter,shortConverter,uploadedFileConverter,VRaptorRequestProvider,httpServletRequestProvider,httpServletResponseProvider,httpSessionProvider,defaultInterceptorStack,defaultRequestExecution,entityManagerCreator,entityManagerFactoryCreator,JPATransactionInterceptor,usuarioDAO,imovelDAO,loginController,indexController,imagemController,homeController,imovelController,accesControllerInterceptor,imagens,usuarioLogado,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,restrictionChecker,pageHandler,org.springframework.aop.config.internalAutoProxyCreator,cacheBasedTypeCreator]; root of factory hierarchy
16:38:04,136  INFO [DefaultConverters   ] Registering bundled converters
16:38:04,309  INFO [RouteBuilder        ] /login                                                       -> LoginController.login()
16:38:04,318  INFO [RouteBuilder        ] /login/adiciona                                              -> LoginController.adiciona(Usuario)
16:38:04,318  INFO [RouteBuilder        ] /login/autentica                                             -> LoginController.autentica(Usuario)
16:38:04,319  INFO [RouteBuilder        ] /login/logout                                                -> LoginController.logout()
log4j:WARN No appenders could be found for logger (br.com.bronx.vraptor.restrictrex.startup.PageHandler).
log4j:WARN Please initialize the log4j system properly.
16:38:04,365  INFO [RouteBuilder        ] /index/lista                                                 -> IndexController.lista()
16:38:04,366  INFO [RouteBuilder        ] /index                                                       -> IndexController.index()
16:38:04,374  INFO [RouteBuilder        ] /filme/{filme.id}/imagem                                     -> ImagemController.upload(Imovel, UploadedFile)
16:38:04,379  INFO [RouteBuilder        ] /filme/{filme.id}/imagem                                     -> ImagemController.download(Imovel)
16:38:04,380  INFO [RouteBuilder        ] /home                                                        -> HomeController.home()
16:38:04,381  INFO [RouteBuilder        ] /imovel/adiciona                                             -> ImovelController.adiciona(Imovel)
16:38:04,382  INFO [RouteBuilder        ] /imovel/lista                                                -> ImovelController.lista()
16:38:04,383  INFO [RouteBuilder        ] /imovel/edita                                                -> ImovelController.edita(Long)
16:38:04,387  INFO [RouteBuilder        ] /imovel                                                      -> ImovelController.formulario()
16:38:04,391  INFO [RouteBuilder        ] /imovel/altera                                               -> ImovelController.altera(Imovel)
16:38:04,392  INFO [RouteBuilder        ] /imovel/remove                                               -> ImovelController.remove(Long)
16:38:04,393  INFO [VRaptor             ] VRaptor 3.1.1 successfuly initialized
17/04/2010 16:38:04 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
17/04/2010 16:38:04 org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
17/04/2010 16:38:04 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/54  config=null
17/04/2010 16:38:04 org.apache.catalina.startup.Catalina start
INFO: Server startup in 2584 ms

No web.xml está:

<context-param>  
        <param-name>br.com.caelum.vraptor.packages</param-name>  
        <param-value>br.com.bronx.vraptor.restrictrex</param-value>  
    </context-param>  

Tô tomando erro 404 ao acessar a aplicação pelo browser, sendo que ele encontra a index conforme aparece ai.
Sabe o que pode ser isso?

Já consigo acessar a aplicação, o problema era na anotação @Path da index. Mas o Warn do log4j continua acusando o appenders do PageHandler

Abraço!

Opa! Mais uma vitória aqui!
Consegui resolver o problema de mostrar o nome do usuário logado na JSP após ele ser incluido na sessão.
Este método é para usar com usuários cadastrados no banco.

No LoginController ficou assim:

public void autentica(Usuario usuario) {
		Usuario autenticado = usuarioDao.buscaUsuarioPorLoginESenha(usuario);
		if (autenticado != null) {
			this.usuarioLogado.setUsuarioLogado(autenticado);// guardo o usuário na sessão
			result.use(Results.logic()).redirectTo(HomeController.class).home();
		} else
			this.validator.add(new ValidationMessage("Login incorreto", "login.incorreto"));
		    this.validator.onErrorUse(Results.logic()).redirectTo(LoginController.class).login();

	}

O método de buscar por login e senha estão na apostila da Caelum, é só seguir por lá.

Eu estava fazendo errado, guardando na sessão o “usuario” ao invés de “autenticado”.

Na JSP ficou assim:

<c:choose>
		<c:when test="${usuarioLogado.usuarioLogado eq null}">
		Você não está logado.<a href="<c:url value="/login"/>">Fa&ccedil;a login</a>		
		</c:when>
		<c:otherwise>
		Ol&aacute;, ${usuarioLogado.usuarioLogado.nome }! <a href="<c:url value="/login/logout"/>">Logout</a>			
		</c:otherwise>
		</c:choose><br />

E por fim na classe UsuarioLogado tenho este método:

public String getNome() {  
	     return usuarioLogado.getNome();  
	}

O lance dos roles é que não tá funcionando aqui, anotei desta forma:

@Resource
@LoggedIn 
@Roles(roles="admin")
public class ImovelController {
//implementação aqui
}

Teóricamente só o admin poderia acessar esse controlador, mas o “guest” que eu cadastrei no banco tb está acessando. =/

Na classe Perfil está assim:

public Perfil getPerfil() {
		Perfil perfil = new Perfil();
		if (this.usuarioLogado != null) {
			perfil.setLoggedIn(true);
			perfil.setRoles(this.getRolesUsuario());
		}
		return perfil;
	}

private List<String> getRolesUsuario() {
		List<String> roles = new ArrayList<String>();
		roles.add("admin");
		roles.add("guest");
		return roles;
	}

Alguma idéia do que possa ser?
Abraço!

Resolvi essa tb!!
O acesso ao Controller anotado com role=“admin” agora só acessa usuário que é admin, o método para pegar o role do usuário lá no banco ficou assim:


public String getRole() {
		return usuarioLogado.getRole();
	}

public Perfil getPerfil() {
		Perfil perfil = new Perfil();
		if (this.usuarioLogado != null) {
			perfil.setLoggedIn(true);
			List<String> roles = new ArrayList<String>();
			roles.add(this.usuarioLogado.getRole());
			perfil.setRoles(roles);
		}
		return perfil;
	}

Para quem quiser mostrar além do usuário na JSP, o role do usuário é só colocar desta forma:

<c:choose>
		<c:when test="${usuarioLogado.usuarioLogado eq null}">
		Você não está logado.<a href="<c:url value="/login"/>">Fa&ccedil;a login</a>		
		</c:when>
		<c:otherwise>
		Ol&aacute;, ${usuarioLogado.usuarioLogado.nome }!, ${usuarioLogado.usuarioLogado.role } <a href="<c:url value="/login/logout"/>">Logout</a>			
		</c:otherwise>
		</c:choose>

Abraço! =)