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.
publicclassUser{privateStringusername;}
@Intercept@RequestScopedpublicclassSecurityInterceptorimplementsInterceptor{privateUsertheUser;publicSecurityInterceptor(UsertheUser){this.theUser=theUser;}publicbooleanaccepts(ResourceMethodmethod){// se você quer interceptar tudo retorne sempre true// ou então implemente aqui sua lógica }publicvoidintercept(InterceptorStackstack,ResourceMethodmethod,Objectobject){// implemente sua lógica de validar o acesso aquiif(theUser==null||!theUser.isAuthenticated()){// usuário é nulo e não autenticadoresult.use(Results.page()).forwardTo("minha-tela-de-login");}else{// aha! usuário tem acesso}}}
T
thiefofwisdom
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
garcia-jj
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
thiefofwisdom
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)publicclassAdminLogic{privatefinalDAOFactoryfactory;privateUseruser;HttpServletRequestrequest;HttpServletResponseresponse;publicAdminLogic(DAOFactoryfactory,HttpServletRequestrequest,HttpServletResponseresponse){this.factory=factory;this.request=request;this.response=response;}publicvoidlogin(){}@ViewlesspublicvoidperformLogin(Useruser){StringrequestedURL=request.getSession().getAttribute("uri").toString();RequestDispatcherrd=request.getRequestDispatcher("/user.list.logic");System.out.println(request.getSession().getAttribute("/"+requestedURL));DAOUseruserDAO=this.factory.getUserDAO();this.user=userDAO.uniqueUser(user);if(this.user!=null){try{rd.forward(request,response);}catch(Exceptione){e.printStackTrace();}}else{//nem cheguei a colocar nenhuma condição aqui ainda.....}}publicvoidlogout(){this.user=null;}@Out(scope=ScopeType.SESSION)publicUsergetUser(){returnuser;}}
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...
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.
OMG, agora ví que ele usa vraptor2. Hehehehe. O ideal é colocar sempre nos tópicos avisando a versão.
T
thiefofwisdom
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
sempre confundo, ainda bem que o eclipse me chinga qdo eu faço isso
e tranquilo, não precisa fazer agora… mas o 3 é (bem) melhor que o 2, e migrar é fácil
[]'s
T
thiefofwisdom
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…
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
garcia-jj
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.