Vraptor - Liberar somente uma página

14 respostas
101574

Galera,

Finalizei um projeto, bacana no vraptor. E não estou conseguindo acertar uma coisinha.

Eu fiz uma anotação, chamada liberada. E eu só quero liberar a página inicial, onde eu coloquei o formulário de login. Como eu faço para implementar esse método aqui.

// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado. public boolean accepts(ResourceMethod method) { return !usuario.isLogado() && !method.containsAnnotation(Liberado.class); }

Assim, ele bloquei tudo.

Valeu.

14 Respostas

magnocosta

Olá,

Você pode criar um Interceptor para fazer esse trabalho
Mais detalhes você pode ver na documentação http://vraptor.caelum.com.br/pt/docs/interceptadores/

Espero ter ajudado !

=D

101574

Eu ja criei o interceptor.
Eu só não estou acertando, a instrução para liberar somente a página inicial, sendo a mesma. Anotada como liberada.

DaniloAndrade

se o usuario estiver logado ele vai ter acesso a todas as paginas?

se for isso seu metodo deveria estar assim

// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado.  
    public boolean accepts(ResourceMethod method) {  
                 
            if(usuario.isLogado()){ // se ele estiver logado tera acesso a todas as paginas
              return true;
              }
           //se não so terá acesso as que estiverem anotadas com Liberado
          return method.containsAnnotation(Liberado.class); 
    }

acho que é isso

101574

Poww cara,

Não funfou, o que chrome me retorna.

Tem outra ideia não?

flw.

DaniloAndrade

velhinho, agora ficou difícil… coloca um break point no interceptor e no metodo do seu controler e da uma analisada no que esta acontecendo

DaniloAndrade

coloca seu interceptor, controlle pra agente da uma olhada

Lucas_Cavalcanti

method.containsAnnotation só vale pra anotação no método, não vale pra anotação na classe.

101574

Bom dia!

Meu interceptor está aqui.

package eletronica.infra.interceptores;

import eletronica.infra.interfaces.Liberado;
import eletronica.modelo.UsuarioWeb;
import br.com.caelum.vraptor.InterceptionException;
import br.com.caelum.vraptor.Intercepts;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.blank.IndexController;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.interceptor.Interceptor;
import br.com.caelum.vraptor.resource.ResourceMethod;
/*
 * Anotação - Interceptar Onde encontrar a anotação, vai ser interceptada
 * Metodo intercept vai ser executado.
 */

@Intercepts
public class UsuarioInterceptor implements Interceptor {

	// Variavéis

	private final UsuarioWeb usuario;
	private final Result result;

	// Construtor
	public UsuarioInterceptor(UsuarioWeb usuario, Result result) {
		this.usuario = usuario;
		this.result = result;

	}

	// Vai interceptar se o metodo não tiver a anotação Liberado
	public boolean accepts(ResourceMethod method) {
		  return false;
	}

	// Metodo intercept - o que deve ser feito quando é encontrado a anotação
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
					result.redirectTo(IndexController.class).index();
		

	}
}

Uma coisa, a anotação @Liberado está em método.

Conforme aqui.

@Path("/")
	@Liberado
	public void index() {
		result.include("variable", "VRaptor!");
	}

Valeu pela atenção galera.
Abraço.

Lucas_Cavalcanti

com isso:

// Vai interceptar se o metodo não tiver a anotação Liberado  
    public boolean accepts(ResourceMethod method) {  
          return false;  
    }

nunca vai passar pelo interceptor vc deveria fazer algo como:

return !usuario.isLogado() && !method.containsAnnotation(Liberado.class)
&& !method.getResource().getType().isAnnotationPresent(Liberado.class);
fredericomaia10

Olha esse tutorial! Vai ficar fácil!

http://wbotelhos.com/2010/04/07/controle-de-login-com-vraptor-3

101574

Eu tinha deixado com false, para não interceptar. Porque dessa forma estava bloqueando tudo.

// Vai interceptar se o metodo não tiver a anotação Liberado e o usuário não estiver logado.  
    public boolean accepts(ResourceMethod method) {  
                 return !usuario.isLogado() && !method.containsAnnotation(Liberado.class);  
    }

Cara, ainda não funcionou. Acredita.

Olha minha classe Usuário.
@Entity
public class Usuario {
	
	@Id
	@GeneratedValue
	private Long id;
	private String nome;
	private String login;
	private String senha;
//getters and setters
}
Minha classe UsuarioWeb;
@Component
@SessionScoped
public class UsuarioWeb {
	
	private Usuario logado;
	
	public void login(Usuario usuario) {
	this.logado = usuario;
	}
	
	public String getNome() {
	return logado.getNome();
	}
	
	public String getLogin() {
	return logado.getLogin();
	}
	public Long getId() {
	return logado.getId();
	}
	public boolean isLogado() {
	return logado != null;
	}
	public void logout() {
		this.logado = null;
	}
}
Meu UsuarioController
@Resource
public class UsuarioController {
	private final UsuarioWeb usuarioWeb;
	private final UsuarioDAO dao;	
	private final Result result;
	private final Validator validator;

	public UsuarioController(UsuarioDAO dao, Result result,
			Validator validator, UsuarioWeb usuarioWeb) {
		this.dao = dao;		
		this.result = result;
		this.validator = validator;
		this.usuarioWeb = usuarioWeb;
	}
	
	public void loginForm() {
	}
	
	@Path("/usuario/novo")
	public void novo() {
	}
		
	@Post("/usuario")
	public void adiciona(Usuario usuario) {
		if (dao.existeUsuario(usuario)) {
			validator.add(new ValidationMessage("Login já existe",
					"usuario.login"));
		}
		validator.onErrorUsePageOf(UsuarioController.class).novo();
		dao.adiciona(usuario);
		result.redirectTo(IndexController.class).index();
	}
	
	
	@Post("/login")
	public void login(Usuario usuario) {
		Usuario carregado = dao.carrega(usuario);
		if (carregado == null) {
			validator.add(new ValidationMessage("Login e/ou senha inválidos",
					"usuario.login"));
		}
		validator.onErrorUsePageOf(UsuarioController.class).loginForm();
		usuarioWeb.login(carregado);
		result.redirectTo(AdministracaoController.class).administracao();
	}

	@Path("/logout")
	public void logout() {
		usuarioWeb.logout();
		result.redirectTo("/");
	}
	
	@Get("/usuario")
	public List<Usuario> lista() {
		return dao.listaTudo();
	}
	
	
	// Edição
	
	@Get("/usuario/{id}")
	public Usuario edita(Long id) {
		//Include lista de bairros	
		return dao.carrega(id);
	}

	// Alteração - Gera a interface para alterar
	// Envia o ID para alterar
	
	@Put("/usuario/{usuario.id}")
	public void altera(final Usuario usuario) {
		dao.atualiza(usuario);
		// Redireciona para a paǵina 
		result.redirectTo(this).lista();
	}
	
	// Remove
		// Envia o ID para Remoção
		@Delete("/usuario/{id}")
		public void remove(Long id) {
			Usuario usuario = dao.carrega(id);
			dao.remove(usuario);
			// Redireciona para a listagem, após a inserção.
			result.redirectTo(this).lista();
		}

		// Busca por nome
		public List<Usuario> busca(String nome) {
			result.include("nome", nome);
			return dao.busca(nome);
		}

		// Busca Json para auto completar
		@Get("/usuario/busca.json")
		public void buscaJson(String q) {
			result.use(json()).withoutRoot().from(dao.busca(q)).exclude("id")
					.serialize();
		}


}
Meu interceptor
@Intercepts
public class UsuarioInterceptor implements Interceptor {

	// Variavéis

	private final UsuarioWeb usuario;
	private final Result result;

	// Construtor
	public UsuarioInterceptor(UsuarioWeb usuario, Result result) {
		this.usuario = usuario;
		this.result = result;

	}

	// Vai interceptar se o metodo não tiver a anotação Liberado
	public boolean accepts(ResourceMethod method) {
		return !usuario.isLogado() && !method.containsAnnotation(Liberado.class)  
				&& !method.getResource().getType().isAnnotationPresent(Liberado.class);
		}

	// Metodo intercept - o que deve ser feito quando é encontrado a anotação
	public void intercept(InterceptorStack stack, ResourceMethod method,
			Object resourceInstance) throws InterceptionException {
					result.redirectTo(IndexController.class).index();
		

	}
}

Valeus!

101574

fredericomaia10:
Olha esse tutorial! Vai ficar fácil!

http://wbotelhos.com/2010/04/07/controle-de-login-com-vraptor-3


Cara valeu pela dica. Já tinha visto esse artigo.
A questão é que so quero liberar uma página.
Mas não estou conseguindo.

101574

Estou para trocar para bloqueado, e bloquear um por um.rsrs.

101574

Cara, que burrice a minha.

Eu precisa liberar também o método login

@Liberado
	@Post("/login")
	public void login(Usuario usuario) {
		Usuario carregado = dao.carrega(usuario);
		if (carregado == null) {
			validator.add(new ValidationMessage("Login e/ou senha inválidos",
					"usuario.login"));
		}
		validator.onErrorUsePageOf(UsuarioController.class).loginForm();
		usuarioWeb.login(carregado);
		result.redirectTo(AdministracaoController.class).administracao();
	}

Senão, antes de ele logar no sistema, o vraptor vai interceptar e eu não consigo autenticar no sistema.

Valeus.

Criado 11 de janeiro de 2013
Ultima resposta 14 de jan. de 2013
Respostas 14
Participantes 5