Vraptor - Liberar somente uma página

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.

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

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.

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

Poww cara,

Não funfou, o que chrome me retorna.

Tem outra ideia não?

flw.

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

coloca seu interceptor, controlle pra agente da uma olhada

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

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.

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);

Olha esse tutorial! Vai ficar fácil!

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

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

[code]
@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();
	}

}[/code]

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!

[quote=fredericomaia10]Olha esse tutorial! Vai ficar fácil!

http://wbotelhos.com/2010/04/07/controle-de-login-com-vraptor-3[/quote]
Cara valeu pela dica. Já tinha visto esse artigo.
A questão é que so quero liberar uma página.
Mas não estou conseguindo.

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

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.