Redirecionamento VRaptor Apos validação login [RESOLVIDO]

18 respostas
T

Olá pessoal,

Gostaria de saber como deixar que o usuario acesse a pagina que queria acessar apos fazer o login.

Por ex : User tenta editar um produto. > Sistema intercepta e pede para ele fazer login. > Sistema manda ele para a pagina de edicao de produto

Só q eu queria isso generico… nao configurando no propreties. Queria q o sistema o enviasse sempre pra onde ele queria acessar.

Obrigado!

18 Respostas

G

A maneira mais correta é usar JAAS. O Java já provê uma forma automatizada de fazer controle de acesso via JAAS.

Porém se você quiser deixar isso a cargo do vraptor você pode criar uma entidade usuário com os dados que você precisa e um interceptor que intercepte as requições que você quer e valide o login.

public class User {
    private String username;
}
@Intercept @RequestScoped
public class SecurityInterceptor implements Interceptor {
    private User theUser;

    public SecurityInterceptor(User theUser) {
        this.theUser = theUser;
    }

    public boolean accepts(ResourceMethod method) {
        // se você quer interceptar tudo retorne sempre true
        // ou então implemente aqui sua lógica 
    }

    public void intercept(InterceptorStack stack, ResourceMethod method, Object object) {
        // implemente sua lógica de validar o acesso aqui
        if (theUser == null || !theUser.isAuthenticated()) { // usuário é nulo e não autenticado
             result.use(Results.page()).forwardTo("minha-tela-de-login");
        } else {
            // aha! usuário tem acesso
        }
    }

}
T

Po cara… valeu pela dica mas nao entendi direito…
Na verdade acho que oque eu queria fazer é mais facil do que parece…
Só queria dar um jeito de salvar pra onde o usuario estava indo antes de cair no interceptor…
A parte dele poder ou nao entrar eu ja estou sabendo fazer… ja tenho a logica e tudo mais… so quero saber exatamente na logica em que eu valido o usuario, como deixar ele prosseguir para a tela que ele tentava acessar…

esta funcionando assim :

user clica no link > link precisa de validacao para ser acessado > sistema obriga o user a se logar > sistema direciona o user para pagina inicial, e nao para a tela que ele tentou acessar… e esse é o meu problema…

sera q vc nao me entendeu ou eu nao te entendi? ehhehee
de qualquer forma, obrigado pela ajuda!

ricardosoares

eu também estou querendo fazer isto.

alguém sabe?

Lucas_Cavalcanti

Bom, dá pra fazer um jeito que só funciona com requisições GET (pra POST é melhor que o cara preencha o formulário de novo mesmo)

no seu interceptor/filtro de autenticação, vc guarda a URI que o cara tá tentando acessar (precisa do HttpServletRequest):
se deu erro de autenticação:

String uri = request.getRequestURI()
    request.getSession().setAttribute("URI_CHAMADA", uri);

qdo logar:

String uri = request.getSession().getAttribute("URI_CHAMADA");
   if (uri != null)
       response.sendRedirect(uri);
   else
       //redireciona pra uma página padrão

se vc quiser os parâmetros tb, vc tem que montar a URI com os parâmetros meio que na mão…

G

thiefofwisdom, realmente acho que entendi errado, heheheheh. Mas a dica do Lucas resolve isso.

Abraços

ricardosoares

valeu Lucas!

a idéia de guardar a URI na session é melhor do a que eu tinha tido: invocar o metodo login do controller passando a URI como parâmetro (na verdade, nem sei se ida dar certo, rsss).

a propósito, alguém aí já tem algo pronto ou idéia concebida para o recurso de “[] remember me” ?
bem… talvez o assunto seja caso de novo tópico.

abraços

Lucas_Cavalcanti

vc precisa adicionar cookies com duração grande… e na hora de logar, ler esses cookies…

T

Oi Lucas!

Entao cara... eu tinha tido exatamente essa ideia... so q acheio meio "gambiarra" mas acaba q no final fica facil de implementar...
Agora estou tendo o seguinte problema :
na hora de redirecionar, apos validar o login do usuario, nao consigo...

Estou tentabndo com o seguinte codigo...

@Component("admin")
@InterceptedBy(DAOInterceptor.class)
public class AdminLogic {

	
	private final DAOFactory factory;
	private User user;

	HttpServletRequest request;

	HttpServletResponse response;
	
	public AdminLogic(DAOFactory factory, HttpServletRequest request, HttpServletResponse response) {
		this.factory = factory;
		this.request = request;
		this.response = response;
	}
	

	
	public void login() {
	}	
	
	@Viewless
	public void performLogin(User user) {
		String requestedURL = request.getSession().getAttribute("uri").toString();
		RequestDispatcher rd = request.getRequestDispatcher("/user.list.logic");
		
		System.out.println(request.getSession().getAttribute("/"+requestedURL));
		
		DAOUser userDAO = this.factory.getUserDAO();
		this.user = userDAO.uniqueUser(user);
		if (this.user != null) {
			try {
				
				rd.forward(request, response);
				
			} catch (Exception e) {
				e.printStackTrace();
			}
		}else{
	                         //nem cheguei a colocar nenhuma condição aqui ainda.....
		}
	}
	public void logout() {
		this.user = null;
	}
	@Out(scope=ScopeType.SESSION)
	public User getUser() {
		return user;
	}
}

nao funciona.... coloquei ali ate fixo como vcs podem ver, mas nao rola.... ele fica na mesma pagina...
o unico jeito q ele mandou pra outra pagina foi quando eu coloquei "/user/list.ok.jsp"
ow seja... o endereço fisico mesmo...
mas ai é looogico q ele pulou minha logica inteira e carregou uma lista vazia...

alguem sabe oq pode ser?

Lucas_Cavalcanti

usa ao invés do requestDispatcher:

request.sendRedirect(requestedURL);

e atualiza a versão do vraptor :wink:
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/

G

O remember-me é uma opção um pouco perigosa. Há duas opções de remember: apenas do login do usuário ou aquele que você mantém o cara sempre autenticado. Essa segunda eu não aconselho não, pois sabe como usuário é… sempre muito desleixado.

Se você quiser lembrar apenas o login do usuário a única opção mesmo é via cookie. Em um sistema meu eu deixava um cookie chamado remember_username com o valor do username dele. Quando o usuário fizer login eu verifico se remember=true e salvo no cookie o valor do username. E no JSP onde eu tenho o campo eu imprimia o valor do cookie. Bem simples.

Se você quiser manter o usuário sempre conectado o que você precisa fazer é guardar um cookie com algum hash que não permita ser burlado. Uma boa opção é guardar um MD5 concatenando o login do usuário, a senha e um código fixo teu. Aí você guarda um cookie com login e outro com esse hash. Quando o usuário entrar no sistema você valida o usuário, bate o hash com login + senha + fixo e autentica ou não.

Esse segundo é mais complicado, hehehe.

Abraços

G

lucascs:
usa ao invés do requestDispatcher:

request.sendRedirect(requestedURL);

e atualiza a versão do vraptor :wink:
http://vraptor.caelum.com.br/documentacao/migrando-do-vraptor2-para-o-vraptor3/

OMG, agora ví que ele usa vraptor2. Hehehehe. O ideal é colocar sempre nos tópicos avisando a versão. :smiley:

T

po lucas… desculpa ae… mas nao tem como eu fazer isso agora…
como prometi antes, quando eu terminar meu tcc eu vou passar pro 3 e postar o prjetinho aqui pro pessoal baixar…

e arrr… acho q vc quis dizer response né?

deu certo cara… valeu demais…
vo colocar como resolvido no topico…

Lucas_Cavalcanti

isso, response :stuck_out_tongue:
sempre confundo, ainda bem que o eclipse me chinga qdo eu faço isso :stuck_out_tongue:

e tranquilo, não precisa fazer agora… mas o 3 é (bem) melhor que o 2, e migrar é fácil :wink:

[]'s

T

eu imagino… só pra saber, ja tem tutorial do e-commecre ou algum outro projeto com o vraptor 3?
seria legal se vcs implementassem um diferente dessa vez caso ja nao o tenham feito!

Abração

Lucas_Cavalcanti

tem o MyDVDs que está meio básico ainda disponível no site pra download…

e tem o curso do VRaptor que a partir de semana que vem vai começar a usar o VRaptor 3 =)
http://www.caelum.com.br/curso/fj-28-vraptor-hibernate-ajax/

esse curso vai montar um sistema de e-commerce…

G

Eu tinha um sistema que era em vraptor 2.6. Bom… o sistema possuía na época 350 entidades (aprox 400 tabelas) e aproximadamente 300 controllers. Foi relativamente simples migrar tudo, durou uma semana de migração e uma semana de testes. Segui as indicações da documentação de como migrar e funcionou tudo bem e sem problemas.

O projeto é em EJB3 e o vraptor atua apenas no módulo web, que é separado do EJB remoto onde ficam as regras de negócio.

O ganho que tivemos com isso foi muito maior que o tempo gasto na migração.

ricardosoares

garcia-jj:
O remember-me é uma opção um pouco perigosa. Há duas opções de remember: apenas do login do usuário ou aquele que você mantém o cara sempre autenticado. Essa segunda eu não aconselho não, pois sabe como usuário é… sempre muito desleixado.

É Garcia, eu tb nunca fui fã do remember-me… mas uma vez um cliente pediu e, após relutar em implementar, tive que concordar com necessidade dele.
Ele queira que apenas uma página fosse possível utilizar o recurso, onde nela estaria as pendências a serem aprovadas e tal. E, quando ele clicasse numa pendência para aprovar/desaprovar, aí sim era necessário se “logar” independente de remembered ou não. Dessa forma, poupava a necessidade de login a cada vez que fosse verificar as pendências. Nota: o login tem CAPTCHA e outros complicadores além.
Com o Spring Security foi moleza, pois nele há embutido a role “IS_AUTHENTICATED_REMEMBERED”. E todo esse controle (cookies, etc.) é tratado por ele.
Eu ainda não estou desenvolvendo nada com vraptor. Mas quando for, queria abrir mão do Spring Security. Já que quase tudo no vraptor é simples de se fazer.
Vou dar mais algumas fuçadas antes de decidir o que fazer.
Obrigado pelas dicas.

Abraço

G

Ricardo, muito bem lembrado. Embora eu não seja fã do Spring, o Acegy/Spring Security é muito bom. Aliás você pode usar ambos juntos. Uma boa é usar Spring Security para controle de acesso e autenticação, e o vraptor como controlador.

Atualmente em uma aplicação que estou no momento uso o vraptor apenas como controller. A autenticação e controle de acesso é via JAAS e o negócio é com EJB. Todos trabalham muito bem. Cogitei usar Spring Security, mas como eu precisava propagar o subject para o EJB optei pelo JAAS.

Abraços

Criado 9 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 18
Participantes 4