Vraptor + Angularjs + Autenticação

571 views
Skip to first unread message

Ricardo Wiesner

unread,
Jul 2, 2015, 4:04:08 PM7/2/15
to caelum-...@googlegroups.com

Ola Pessoal,

Estou trabalhando em uma aplicação que tem Vraptor 4 + AngularJS. Para realizar o controle do acesso e saber se o cliente esta logado utilizo o objeto de sessão no lado do servidor e armazeno algumas informações no lado do cliente utilizando localStorage. 

Nesse caso tenho o seguinte problema que o objeto de sessão tem o timeout e o localStorage permanece com as informações no navegador.
Pode ocorrer que o usuário permanece com o navegador aberto e do lado do servidor a sessão expire.
Como criar um mecanismo para manter o usuário logado ??

Outra duvida seria como ter um controle de múltiplas sessões por usuário. Como por exemplo: o mesmo usuário está conectado com diversos dispositivos. 



José Filipe Lyra

unread,
Jul 3, 2015, 7:33:28 AM7/3/15
to caelum-...@googlegroups.com
Oi Ricardo!

Cara, aqui eu utilizo JWT (Json Web Token). Resumindo bastante, o JWT tem uma parte pública e outra privada no token, assim na parte pública você pode incluir informações que precisar conferir no front.

No front você pode guardar esse token inteiro no localStorage, como você já faz.
Configure um $http interceptor no Angular para enviar o token em todas as requisições para o servidor.

Para saber se o usuário ainda está logado no front é só fazer algum serviço responsável por isso.

Do lado do VRaptor, só fazer um interceptor para verificar a validade do token.

Tem diversos plugins para Angular e é muito fácil integrar com o VRaptor (posso até te ajudar).

Obs.: Imagino que você já deve estar usando Rest ou algo do tipo, né? Se sim, recomendo fortemente a retirar a sessão do lado do servidor, já que para ser Restful a conversa precisa ser stateless ;)

Abraço,

--
Você recebeu essa mensagem porque está inscrito no grupo "caelum-vraptor" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para caelum-vrapto...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para caelum-...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/caelum-vraptor.
Para mais opções, acesse https://groups.google.com/d/optout.

José Filipe Lyra

unread,
Jul 3, 2015, 7:38:33 AM7/3/15
to caelum-...@googlegroups.com
Ah, esqueci da sua última dúvida:
Outra duvida seria como ter um controle de múltiplas sessões por usuário. Como por exemplo: o mesmo usuário está conectado com diversos dispositivos.

Eu ainda não cheguei a fazer múltiplas sessões, mas imagino que poderia guardar este token numa tabela no seu banco.
Para identificar cada token, adicione alguma informação dentro dele (na parte pública, por exemplo) que represente aquela "sessão".

Desta maneira você tem sessão para cada dispositivo, podendo inclusive invalidar alguma específica, caso usuário peça.

Abraço!

Ricardo Wiesner

unread,
Jul 3, 2015, 7:56:25 AM7/3/15
to caelum-...@googlegroups.com
Ola José,

Seguindo a logica, tenho o token armazenada no localstorage. 

Digamos que o usuário descubra o token e copie ele para outra máquina, teoricamente ele teria o acesso ao sistema? Assim geraria uma falha de segurança. Utilizando JWT teria mecanismo para contornar a situação ??

Abraço !

José Filipe Lyra

unread,
Jul 3, 2015, 8:05:52 AM7/3/15
to caelum-...@googlegroups.com
Tem como você controlar isso sim. 
O JWT é composto por 3 partes:
  • Primeira parte: informa a criptografia;
  • Segunda parte: a parte pública, onde vão seus dados (usuário, data de expiração, dispositivo e etc);
  • Terceira parte: composta pelo hash das partes anteriores (logo se alguém alterar o conteúdo de qualquer uma das partes o token será inválido). Esta terceira parte é privada, apenas o backend deve conhecer a chave.
Considerando, então, que o token é válido e que você adicionou a identificação do dispositivo nele, é só checar se quem está com o token é o dispositivo autorizado.

O que acha da sugestão?

Alexandre Xavier

unread,
Jul 3, 2015, 8:01:15 PM7/3/15
to caelum-...@googlegroups.com
Boa noite.

José.

Gostei dessa ideia com o JWT, estou usando AngularJS com o Vraptor e na autenticação estou utilizando o vraptor-brutauth.
Gostaria de utilizar o JWT, pesquisando na internet achei essa implementação para java: https://github.com/auth0/java-jwt
Queria saber se ela que você utiliza e se tem algum exemplo ?
Obrigado.

José Filipe Lyra

unread,
Aug 5, 2015, 10:55:27 AM8/5/15
to caelum-...@googlegroups.com
Alexandre, cara, foi mal a demora!!! Aliás, muito mal!
Li sua mensagem na correria e fiquei de mandar, porém me esqueci completamente. Por alguma razão me veio isso na cabeça agora.
Enfim, peço perdão novamente =)

Estou usando exatamente o java-jwt. A documentação deles não é muito boa (pra não dizer quase inexistente, rs). Eu me guiei bastante pelos testes do projeto
Vou criar um projeto de exemplo e coloco no github entre hoje e amanhã.

Ah, considerando que te enrolei 1 mês para responder (rs), por acaso vc chegou a montar algum projeto para testar ou encontrou algum exemplo? Se sim, pode compartilhar também?

Abraço!

Alexandre Xavier

unread,
Aug 10, 2015, 1:56:36 PM8/10/15
to caelum-vraptor
Jose.

Boa tarde.

Não cheguei a implementar nada estava de férias e mudança auhauah, eu vi esse gerador de token:


Por acaso você está utilizando ele na geração do token ?
Fico no aguardo do exemplo.
Obrigado pela ajuda !

José Filipe Lyra

unread,
Aug 10, 2015, 4:49:04 PM8/10/15
to caelum-...@googlegroups.com
Oi Alexandre!

Coloquei o exemplo no github aqui. Fiz uma pequena documentação para mostrar como funciona.
O exemplo não tem nada do front, foquei apenas em algo bem simples no back.

Estou usando o java-jwt. Como eu havia comentado, essa foi a biblioteca que eu gostei mais, porém a documentação deles é péssima. Eu aprendi a trabalhar com o java-jwt lendo os testes unitários deles.

Basicamente você precisa de um interceptor para verificar a validade da requisição. A requisição deve conter um header "Authorization", onde o valor é um token.
O token é verificado pela classe JWTUtil. 


Se tiver alguma dúvida ou sugestão de código me avisa aqui, daí vamos conversando.

Espero ter ajudado.

Abraço!

Alexandre Xavier

unread,
Aug 11, 2015, 8:02:41 PM8/11/15
to caelum-vraptor
Boa noite.

José.

Testei o código e funcionou, fiquei com algumas dúvidas.

A utilização do result.use(Results.http()).addHeader("Authorization", token); no else da classe JWTInterceptor
não seria necessária já que vem isso está no Header do request?

a variável SECRET não teria no java-jwt uma forma de gerar automático?

Hoje pesquisando na net achei esse aqui que já gera a key automaticamente:
 
E aqui no blog da empresa que fez ele tem um explicação melhor:

Ainda não testei ele, mas vendo pelo código fica bem simples.
O que você acha?

E obrigado pela ajuda!.

José Filipe Lyra

unread,
Aug 14, 2015, 10:52:59 AM8/14/15
to caelum-...@googlegroups.com
Bom dia, Alexandre!

A utilização do result.use(Results.http()).addHeader("Authorization", token); no else da classe JWTInterceptor
não seria necessária já que vem isso está no Header do request?
 Realmente é totalmente desnecessário isso. Passou batido. Vou tirar do projeto lá =)

Sobre gerar o SECRET de forma automática, eu não vi nenhum recurso no java-jwt para isso. Até o momento eu não vi nenhuma necessidade de gerar um SECRET de forma automática. Por que no seu caso você precisa disso?

Interessante essa biblioteca JJWT. Vou dar uma olhada com calma e faço um exemplo com ela também.

Vamos conversando!

[]s

Alexandre Xavier

unread,
Aug 24, 2015, 8:58:00 PM8/24/15
to caelum-vraptor
Boa noite.

José.

Na verdade eu achava que era necessário gerar o SECRET de forma automática.
Com essa biblioteca JJWT fiz o exemplo simples, tentei fazer HashMap mas não funcionou,

Estou com uma dúvida na questão de perfil de acesso:
Minha ideia é que o token fique com o id do usuário e o id do setor, 
baseado no setor que vou montar o perfil de acesso, pensei em utilizar interceptor para cada perfil de acesso, 
baseado na ideia do livro, mas queria saber se você implementa de outra maneira?
Obrigado!
 

Alexandre Xavier

unread,
Oct 13, 2015, 8:41:51 PM10/13/15
to caelum-vraptor
Para não deixar em aberto.
Fiz baseado em annotation, anotando apenas o que é restrito nos controllers necessários.
E no Interceptor faço a verificação se está indo para um controller que tem anotação e se o usuário tem acesso aquele controller.

José Filipe Lyra

unread,
Oct 13, 2015, 9:13:04 PM10/13/15
to caelum-...@googlegroups.com
E aí Alexandre! Usei o mesmo caminho que vc, também por annotation.

Se precisar de um controle mais fino da autorização, dá pra incluir as permissões na anotação.
Por exemplo, passar um @Security("client:write") e daí no interceptor vc verifica as autorizações daquele usuário gravadas no banco.

Abs

Reply all
Reply to author
Forward
0 new messages