Interception no vraptor

4 respostas
C

olá pessoal

tenho a classe abaixo:

package mapeamento.controller;

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;

@Intercepts
public class TransactionInterceptor implements Interceptor
{

	private final UsuarioLogado usuario;
	private final Result result;
	
	public boolean accepts(ResourceMethod method) {

		return !usuario.isLogado() && method.containsAnnotation(Restrito.class);
	}
	
	public TransactionInterceptor(UsuarioLogado usuario, Result result)
	{
		this.usuario = usuario;
		this.result = result;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object instance) throws InterceptionException {

		this.result.redirectTo(UsuarioController.class).loginform();
	}
	
}

interface

package mapeamento.controller;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})

public @interface Restrito {

	String[] value();
}

anotação:

@get
@path("/....")
@Restrito({"administrador","gerente","usuario"})
public void ....

gostaria de saber como eu faço para na classe TransactionInterceptor e no metodo accepts eu conseguir pegar os valores do vetor String[] value() ({"administrador","gerente","usuario"}) e verificar se o usuário tem privilegio de acesso a aquele método.

para ficar algo parecido com

public boolean accepts(ResourceMethod method) {
return !usuario.isLogado() && (usuario.nivel=="administrador" || usuario.nivel=="gerente" || usuario.nivel=="usuario") && method.containsAnnotation(Restrito.class);
}

alguém tem uma dica?

vlw.

4 Respostas

Lucas_Cavalcanti

vc pode acessar via:

String[] values = method.getMethod().getAnnotation(Restrito.class).value();

não esqueça de fazer isso só depois de testar se a anotação existe no método

C

consigo acessar os valores, mas agora quando eu executo o projeto aparece

Redirecionamento incorreto

O Firefox detectou que o pedido para este endereço nunca será concluído devido à forma que o servidor o está redirecionando.

* Este problema algumas vezes pode ser causado pela desativação ou bloqueio de cookies.

qual o problema com minha interception, o q eu estou fazendo de errado?

package mapeamento.controller;
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;

@Intercepts
public class TransactionInterceptor implements Interceptor
{

	private final UsuarioLogado usuario;
	private final Result result;
	
	public boolean accepts(ResourceMethod method) {
		
		boolean autorizado=false;
		if (method.containsAnnotation(Restrito.class) && usuario.isLogado())
		{
			String[] values = method.getMethod().getAnnotation(Restrito.class).value();
				
			for(int i=0;i<values.length;i++)
			{
				if (usuario.getNivel().equals(values[i]))
				{
					autorizado = true;
				}
			}
		}
	
		return !autorizado;
	}
	
	public TransactionInterceptor(UsuarioLogado usuario, Result result)
	{
		this.usuario = usuario;
		this.result = result;
	}

	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object instance) throws InterceptionException {

		this.result.redirectTo(UsuarioController.class).loginform();			
	}
	
}

vlw.

Lucas_Cavalcanti

dá uma olhada no accepts… se ResourceMetodo não estiver anotado com @Restrito, ele vai dar true e logo vai cair no redirect pra Usuario/loginForm, que não tá anotado e cai no interceptor de novo, que redireciona de novo infinitamente…

troca a primeira linha pra

boolean autorizado= !method.containsAnnotation(Restrito.class); // assim se não tiver a anotação não passa pelo interceptor
C

vlw Lucas, agora ta funcionando certinho.

t+

Criado 4 de fevereiro de 2010
Ultima resposta 6 de fev. de 2010
Respostas 4
Participantes 2