Restringir paginas no login

Pessoal,

Fiz um sisteminha de login, com Usuario e Senha que funciona certinho. Ele busca os dados no banco, valida e loga.
Porem, se o usuario digitar uma url posteiror ao login ele consegue ter acesso, mesmo sem te-lo feito.

Por exemplo, se ele acessar http://localhost.8080/paginaProtegida.jsp ele consegue, mesmo sem ter feito o login.
Como bloquear isso?

Cara a forma que vou te passar não a mais elegante nem a mais indicada, mas tive o mesmo problema que você e fiz seguinte:

Coloquei como primeiro código em cada JSP

<c:if test="${sessionScope.login == null or sessionScope.senha == null}">
<% response.sendRedirect(“login.jsp”);%>
</c:if>

Acho que você pode usar um desses frameworks de segurança/autenticação. Aqui no GUJ explica-se o JAAS, tem o ACEGI também. Dá uma estudada.

[quote=juliano_FRG]Cara a forma que vou te passar não a mais elegante nem a mais indicada, mas tive o mesmo problema que você e fiz seguinte:

Coloquei como primeiro código em cada JSP

<c:if test="${sessionScope.login == null or sessionScope.senha == null}">
<% response.sendRedirect(“login.jsp”);%>
</c:if>
[/quote]
Se achar mais viável, faça isso…

Apos o login, coloque um objeto com as credenciais do usuario na seção.
Quando for feito um request, verifique se esse objeto esta na seção, se não estiver, redirecione para o login.

  • vc pode fazer esse teste em cada pagina(horrivel)
  • vc pode criar um jsp que faça isso e fazer include dele em todas as paginas(um pouco menos horrivel)
  • vc pode fazer um Filter que valide isso.

E todas essas opções, não esqueça de excluir do teste a agina de login, senão vc nunca vai conseguir logar. :mrgreen:

Acho que no seu caso seria as mehores opções, não acredito que vc esteja precisando de algo mais cmplexo como JAAS ou Acegi.

Se vc pesquisar aqui no forum vai ahar varios exemplos de como trabalhar como Session, Filters e etc.

[]s

<c:if test="${sessionScope.login == null or sessionScope.senha == null}"> <% response.sendRedirect("login.jsp");%> </c:if>

Valeu pessoal! Realmente funcionou!
Para finalizar, eu queria somente uma explicação a respeito deste código.

Eu não entendi o sessionScope.login e o sessionScope.senha. Que campos são esses?
Eu achei que esse login e essa senha fossem os textfields do meu formulario, ou então que eu tivesse que criar um objeto no momento do login e dar um getLogin() e um getSenha(), mas nada… Não precisei mexer em nada na minha aplicação para que este código funcionasse. Alguem poderia me dar uma luz?

Obrigado!

Putzzzzz…
Agora que estou vendo… Não funcionou não. Ele bloqueou o acesso às paginas internas sim, inclusive quando eu faço login. Bem, o código funciona como deu para perceber, mas a questão é realmente o sessionScope.login e o sessionScope.senha…

Creio que se eu entender isso, vou conseguir colocar pra funcionar.

Aguardo ajuda de vocês… Enquanto isso, vou dando uma analisada aqui!

Obrigado!

Fala Maracujá,

Obrigado pela dica! Mas, independentemente de haver outros modos até melhores de se fazer o que estou querendo, eu gostaria de entender o que está acontecendo aqui, e, principalmente, colocar isso para funcionar.

Como o exemplo que estou fazendo é apenas didático, depois posso até fazer com filtros, para aprender os dois modos. Mas neste momento gostaria mesmo de fazer desta forma.

Mas valeu pela dica, cara.

Eu fiz isso aqui na minha Action (LoginAction)

//Colocando o Login na Session Login loginSession = new Login(); loginSession.setLogin(formLogin.getTxtLogin()); loginSession.setSenha(formLogin.getTxtSenha()); HttpSession sessao = request.getSession(); sessao.setAttribute("loginSessao", loginSession); //FIM (Colocando Login na Session

Duvida 1 - Este código está certo?

Duvida 2 - Como faço para verificar esses atributos dentro dos JSPs?

[code]# <c:if test="${sessionScope.login == null or sessionScope.senha == null}">

<% response.sendRedirect(“login.jsp”);%>

</c:if> [/code]

Esse não funciona. Em vez de colocar sessionScope.login, tentei colocar loginSession.login mas também nao funcionou.

Obrigado!

[quote=Maracuja]Voce pode utilisar um Filter, de modo que todas as suas solicitações passem por ele, então nele você verifica por exemplo se o usuário tem o status logado por exemplo; caso contrario redirecione ele para suqa tela de login, desse modo seu sistema ficará protegido.

De uma estudada nestes links.

The Essentials of Filters

Filter code with Servlet 2.3 model

Também tem o Google.[/quote]

Isso, trabalha com Filters.
Deve ter equivalente no Struts, não sei.

Pessoal, consegui.

Gostaria de falar a todos que, nem sempre, estamos a procura da melhor solução aqui neste forum. Muitas das vezes, queremos apenas aprender algo, independentemente de ser a melhor solução ou não.

Neste meu tópico, eu fiquei sabendo que existem frameworks, filtros e outras trezentas mil formas melhores do que a forma que eu estou utilizando para fazer esse esquema de segurança para a minha aplicação, mas eu queria fazer deste jeito, independentemente de ser a melhor forma ou não.

Eu estava curioso em saber porque não estava funcionando e queria entender o que estava acontecendo. Neste momento, eu não queria explicações sobre outras formas, filtros, etc. Queria apenas entender porque o código não estava funcionando!

Mesmo assim, agradeço a todos que postaram suas ideias, mesmo ignorando o que eu desejava e me dando outras dicas :? . Sempre dou valor as pessoas que ajudam as outras pessoas. Obrigado.

Segue a solução…

Este código está dentro do meu Action(LoginAction). Ele coloca o meu objeto de Login (com o login do usuario e a senha) dentro da minha sessao.

//Colocando o Login na Session Login loginSession = new Login(); loginSession.setLogin(formLogin.getTxtLogin()); loginSession.setSenha(formLogin.getTxtSenha()); HttpSession sessao = request.getSession(); sessao.setAttribute("loginSessao", loginSession); //FIM (Colocando Login na Session)

Este é o código que usei em cada JSP, para testar se o usuario estava logado ou não. Caso não estivesse logado, a página de login era exibida.

<c:if test="${loginSessao.login == null || loginSessao.senha == null}"> <%response.sendRedirect("login.jsp");%> </c:if>

Desta forma, está funcionando. Mas como é de costume, seguem algumas dúvidas…

1 - O código que o amigo do forum me mandou, estava assim:
<c:if test="${sessionScope.login == null or sessionScope.senha == null}">

 Eu simplesmente usei EL para acessar o atributo da sessão. Não usei esse sessionScope. Alguem saberia me dizer a diferença?

2 - Esse OR do código que o amigo do forum mandou não funcionou. O engraçado é que eu consultei a documentação sobre EL que eu tenho aqui e parece que está certo. Coloquei entao um || no lugar do OR e funcionou. Alguem sabe o que pode ser?

3 - Essa dúvida refere-se a JavaScript. Acho que não é o forum adequado, mas como esse script está envolvido nesta dúvida, acho que vocês podem me ajudar.
Criei um javascript para validar o formulario de login (testa de os campos estão preenchidos e tal). Acontece que ele só funciona no IE, no FireFox não acontece nada. Isso é normal?

Mais uma vez, obrigado, pessoal!

Voce pode utilisar um Filter, de modo que todas as suas solicitações passem por ele, então nele você verifica por exemplo se o usuário tem o status logado por exemplo; caso contrario redirecione ele para suqa tela de login, desse modo seu sistema ficará protegido.

De uma estudada nestes links.

The Essentials of Filters

Filter code with Servlet 2.3 model

Também tem o Google.