Interceptor Vraptor - Acesso [RESOLVIDO]

5 respostas
Mickdark
Opa!! Estou tentando fazer um esquema de acesso utilizando o padrão classe.metodo, para indicar o que pode ou não ser acessado pelo usuario, então eu gravei no banco os recursos que cada usuario pode acessar pelas urls, e implementei a interface "Interceptor" do Vraptor. Bom, ta até funcionando, até eu tentar utilizar um recurso que utilize um metodo para gravar e/ou alterar, ele me retorna com o erro abaixo:
Fev 13, 2012 11:27:02 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [/Web] threw exception
br.com.caelum.vraptor.InterceptionException: java.lang.IllegalArgumentException: argument type mismatch
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:87)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.tkway.seguranca.AutorizacaoInterceptor.intercept(AutorizacaoInterceptor.java:42)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalArgumentException: argument type mismatch
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)

e como eu implementei no interceptor!

@Intercepts
public class AutorizacaoInterceptor implements Interceptor {
	
	private final UsuarioWeb userWeb;
	private final Result result;
	private Recurso recurso;

	public AutorizacaoInterceptor(UsuarioWeb userWeb, Result result, Recurso recurso) {
		this.userWeb = userWeb;
		this.result = result;
		this.recurso = recurso;
	}

	@Override
	public boolean accepts(ResourceMethod method) {
		System.out.println("Metodo: "+method.getMethod().getName()+"\n");
		return !method.containsAnnotation(Liberado.class);
	}

	@Override
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
		if(this.userWeb.isLogado()){
			recurso.setNome("Administrar");
			if (userWeb.getPrivilegio().getRecursos().contains(recurso)){
				stack.next(method, resourceInstance);
			}
			recurso.setNome(method.getMethod().getDeclaringClass().getSimpleName()+"."+method.getMethod().getName());
			if(this.userWeb.getPrivilegio().getRecursos().contains(recurso)){
				stack.next(method, resourceInstance);
			}
		}
		
		result.redirectTo(UsuarioController.class).logar();
	}
	
}

E o exemplo de um metodo que da erro, mesmo com o usuario settado com o recurso correto, quando eu tento alterar!!

@Path("/privilegio/cadastrarAlterar")@Post
	@DescricaoRecurso("Cadastra ou Altera os Privilegios")
	public void cadastrarAlterar(List<Recurso> recursosList, Privilegio privilegio) throws Throwable {
		//O Privilegio ja vem com o nome, portanto nao preciso seta-lo
		//Aqui eu setto a empresa da qual o privilegio pertence (no caso a que foi carregada no login do usuario)
		privilegio.setEmpresa(this.userWeb.getEmpresa());
		
		/*Verifico se a lista estiver vazia para evitar o NullPointerException
		 * Aqui eu seto os recursos escolhidos para o objeto privilegio
		 * Como o hibernate trabalha com HashSet e o VRaptor com List eu preciso converter de List para HashSet*/
		 if (recursosList==null){
			 privilegio.setRecursos(new HashSet<Recurso>());
		 }else{
			 privilegio.setRecursos(new HashSet<Recurso>(recursosList));
		 }
		
		/* Primeiro eu verifico se o o privilegio é novo ou já existe (cod==null "novo", cod!=null "ja existe")*/
		if(privilegio.getCod()!=null){
			//Se ja existe eu atualizo as informacoes no banco
			this.privDao.mergePrivilegio(privilegio);
		}else{
			//Se for novo, eu cadastro no banco (O privilegio com seus recursos)
			this.privDao.setPrivilegio(privilegio);
		}
		
		//Redireciona para a listagem de privilegios
		result.redirectTo(PrivilegioController.class).privilegios();
	}

5 Respostas

Lucas_Cavalcanti

coloque um else no seu if do interceptor:

if(this.userWeb.isLogado()){  
    //...
 } else {
    result.redirectTo(UsuarioController.class).logar();  
 }

o que acontece é que vc tá dando um stack.next e um redirect “ao mesmo tempo”, daí o vraptor vai se perder

outra coisa: pq vc tá chamando o stack.next duas vezes?

Mickdark

Olá Lucas!!

Funcionou perfeitamente !!!

Lucas Cavalcanti:

outra coisa: pq vc tá chamando o stack.next duas vezes?

É pq eu utilizei uma excessão para quando for administrador, mas acho melhor colocar no banco esas informações, para evitar qualquer tipo de problema quando for fazer alguma manutenção XD!!!

De qualquer maneira muito Obrigado!!!

como o código ficou!!

@Override public void intercept(InterceptorStack stack, ResourceMethod method, Object resourceInstance) throws InterceptionException { if(this.userWeb.isLogado()){ recurso.setNome("Administrar"); if (userWeb.getPrivilegio().getRecursos().contains(recurso)){ stack.next(method, resourceInstance); }else{ recurso.setNome(method.getMethod().getDeclaringClass().getSimpleName()+"."+method.getMethod().getName()); if(this.userWeb.getPrivilegio().getRecursos().contains(recurso)){ stack.next(method, resourceInstance); } } }else{ result.redirectTo(UsuarioController.class).logar(); } }

Mickdark

Ha gostaria de tirar outra dúvida, eu estava procurando por um tutorial para fazer um sistema de acessos utilizando VRaptor, dai eu encontrei esse Framework: http://www.guj.com.br/java/149517-minha-contribuicao---controle-de-acesso-vraptor-3

Que mandou para essa pagina atualizada: http://www.guj.com.br/java/238655-saci---simple-access-controller-vraptor-3
Com nome de Framework SACI, gostaria de saber se ele já está implementado no Vraptor 3 ou vai ficar para alguma outra versão? Pq eu acho que a parte que ele fez de Roles se encaixa perfeitamente no que eu estou tentando fazer!! E sem falar que agente acaba ganhando outras funcionalidades interessantes no pacote ^^

Obrigado!!

Lucas_Cavalcanti

isso pode ser usado no VRaptor 3, como um plugin…

baixe o jar dele, coloque o pacote no web.xml, e daí é só seguir a documentação

Mickdark

Lucas Cavalcanti:
isso pode ser usado no VRaptor 3, como um plugin…

baixe o jar dele, coloque o pacote no web.xml, e daí é só seguir a documentação

Belezz, vou fazer uns testes e qualquer coisa eu posto no tópico dele!!

Valeu e inté

Criado 13 de fevereiro de 2012
Ultima resposta 13 de fev. de 2012
Respostas 5
Participantes 2