Autenticação de Usuário apenas pela Session

Pessoal, procurei por vários lugares e não encontrei, estou querendo criar uma autenticação do tipo “<auth-method>FORM</auth-method>”, tenho meu login, meu bean, tudo certo.
Meu problema é: Eu digito o usuário e a senha, mas não consegui dizer para a session que ela está autenticada e que pode seguir com o processo que no caso é o redirecionamento para a página de menu.
Ela nunca sai da tela de login.

A pergunta é: Como eu faço para dizer a session que ela está autenticada, e que não precisa voltar a página de login?

Eu não quero usar nenhum framework de autenticação, queria fazer uma coisa simples mesmo.

Muito obrigado a todos.

Vou acompanhar esse tópico,ja criei uns 3 tópicos parecidos com o seu e ninguem me respondeu,to precisando da mesma coisa :frowning:

Você poderá criar um servlet interceptador, que receberá como parâmetro o nome da página, neste Servlet você fará a validação da sessão que pode ser visto abaixo

    HttpSession session = req.getSession(); 
    String   user  = req.getParameter("userName"); 
       
    if(user != null) { // authorized 
      res.sendRedirect(res.encodeURL("suaPagina")); 
    } else{
         // Aqui você encaminha pra pagina de login que registrará o sua sessão.
    }

Esta é a forma mais simples que vejo, porém não é a mais elegante, se quiser algo mais eficiente procure por Servlet Filters.

Eu entendi, mas desta forma, o tipo de autenticação que eu informo lá no xml é desnecessária.
O jsf deveria ter um mecanismo que verifica automaticamente se está ou não autenticado.
E é isto que eu gostaria.

De qualquer forma, muito obrigado.

Eu tenho um bean que é responsavel pelo login,nele eu guardo numa variavel o id do usuário logado que é consultado la no banco.Como faço para chamar esse id nas outras classes?

Não tem como você manter o estado seu bean, você tem que adicioná-lo na sessão e depois recuperá-lo como citei acima

O FORM indica que vc quer utilizar o mecanismo de autenticação padrão do Java EE. Para que funcione, é preciso cumprir os seguintes passos:

  • Criar uma página de login, seguindo padrões especificos (action do form: j_security_check, campos de usuario e senha: j_username e j_password)

  • Configurar a forma de autenticação no servidor. Essa parte não é coberta pela especificação, cada servidor implementa à sua maneira. Pode ser através de arquivos de configuração (ex: Tomcat) eu em uma ferramenta de administração (ex: Websphere). Basicamente o que se faz é dizer como os usuários devem ser autenticados. Por exemplo: usar banco de dados XXX, os usuarios estão na tabela YYYY, o campo de login é o ZZZ e o de senha é WW, os grupos (roles) estao na TbKKKK. Enfim, tudo que o container precisa para realizar o processo de login.
    Há diversas opções de autenticação (banco de dados, LDAP, arquivo texto, etc) que vem por padrão nos servidores. Para casos mais específicos é preciso escrever seu próprio Modulo de Login.

  • Configurar o acesso a cada elemento da aplicação, através do web.xml (security constraints) ou na aplicação (método isUserInRole).

Resumidamente é isso… no seu caso qual é o andamento, o que já está feito? Fale mais sobre o problema encontrado

tenho um software desenvolvido em delphi, e quero passar o esquema de login e controle de acesso as rotinas.
o esquema é bom, a lógica está pronta e funcionando perfeitamente, por isto não quero mudar para outro esquema, não quero implementar nada com framework, vou montar meu próprio esquema.
Meu problema está sendo em dizer para a session que ela já está autenticada, e que pode tocar o barco, resolvendo este problema, eu consigo resolver o resto.

Resumindo: Vou montar meu esquema de login, não preciso de algum framework ou do servidor de aplicações, eu só preciso saber como dizer para a session que ela está autenticada e que pode sair da tela de login.

Eu posso usar um servlet apenas para o login e chamo-los nos beans normais?

Essa também é uma maneira, devido a motivos diversos muita gente acaba desenvolvendo sua própria solução de segurança ao invés de usar a do Java EE.

No seu caso, as configurações de segurança do web.xml (por exemplo, auth method) não terão nenhuma utilidade.

Basicamente o que vc precisa é:

  • Criar uma classe representando o login de usuário. Cada usuário logado terá um objeto desses na sessão. Se não tiver é porque não está logado.

  • Implementar algo que intercepte cada requisição às páginas - pode ser um Filter, ou um Listener do Jsf. Se o cara tiver uma sessão ativa e tiver o objeto Usuario então Ok, pode passar. Senão é direcionado automaticamente para a página de login. Opcionalmente podem ser feitas outras validações, por exemplo verificar se o usuario possui determinada permissão.

  • A página de login é a parte mais simples. Quando o usuário der o submit de seu login e senha, estes dados serão validados. Se estiver Ok, criar um objeto Usuario e armazenar na sessão, e em seguida direcionar para a pagina principal (usando um redirect normal).
    Se estiver incorreto, volta para a tela de login.

Isso tem mais a ver com o que vc está fazendo… ?

gomesrod agora eu entendi.
eu achava o seguinte: Como o meu método de autenticação era o FORM, o JSF jogava para minha página de login pq a currentsession não estava autenticada, eu achava que era só dizer para ela que ela estava autenticada e automaticamente não iria mais chamar o form de login, é assim que funciona no .NET, achei que o java também seria igual.
Mas com vc falando que não vai me servir a autenticação do tipo FORM, pq ela é baseada em cima do servidor de aplicações, eu entendi que a história é diferente no Java, vou tentar implementar o Filter, não sei como fazer isto, mas vou fazer aqui

Vc tem algum exemplo de uma página com filter?

Até que não seria mau se fosse desse jeito :slight_smile: Parece bem prático.

Sobre o filtro, existem vários exemplos pela Internet. Faça uma pesquisas por java authorization filter ou java filtro seguranca

gomesrod, obrigado pela força, consegui implementar com o filter, está tudo ok

Luciano_Lopes, acho que esta solução é a única saída para nós.

[quote=Raiduster]gomesrod, obrigado pela força, consegui implementar com o filter, está tudo ok

Luciano_Lopes, acho que esta solução é a única saída para nós.

[/quote]
Fazer oque né?O ruim é que não sei trabalhar com servlets direito,vou ter que dar uma pesquisada.

Raiduster, você poderia postar o código do login aqui para eu ver como você resolveu o problema?