Login/logout JSF, o que esta errado?

11 respostas
rbroz85

Boa tarde.

bem... eu nao concigo implementar o login e logout em JSF =(
es o que eu tenho feito:

public class Login {

    private String nome="";
    private String senha ="";
    private boolean logged = false;
    
    private FacesContext context = (FacesContext) FacesContext.getCurrentInstance();
    private HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
    
   /** Creates a new instance of Login */
    public Login() {
       
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public void setLogged(boolean logged) {
        this.logged = logged;
    }

    public boolean isLogged() {
        return logged;
    }

    public String getSenha() {
        return senha;
    }

    public String getNome() {
        return nome;
    }
    
    public  String validateLogin(){
        if(nome!=null && senha!=null && !nome.equalsIgnoreCase(senha)){
            logged = true;
            return "main";
        }else 
            return "login";
    }
    
    public String doLogout(){
        System.out.println("Deslogando...");
        logged = false;
        if (session != null) {
//            session.invalidate();
            session.setMaxInactiveInterval(3);      
        }
        return "login";
    }
}
<managed-bean>
        <managed-bean-name>Login</managed-bean-name>
        <managed-bean-class>Main.Login</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
    <navigation-rule>
        <from-view-id>/welcomeJSF.jsp</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/welcomeJSF.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>main</from-outcome>
            <to-view-id>/jlogin.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
    
    <navigation-rule>
        <from-view-id>/jlogin.jsp</from-view-id>
        <navigation-case>
            <from-outcome>login</from-outcome>
            <to-view-id>/welcomeJSF.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>

o mecanismo esta funcionando... eu clico em login... vai.... eu clico em logout volta pra login !!
agora como vou ter certeza se isso esta funcionando !?
como testo se esta seguro ?

pois qunado eu clico em botao voltar no navegador...
ele volta ! e ainda mostra as informaçoes do Bean que esta em session

detalhe eu coloquei o :
<meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">  
        <meta http-equiv="expires" content="-1" />

se alguem tiver um exemplo de login e logout pra me mostrar como faz.. ou me apontar o erro ! ficaria mt grato !
obrigado !

11 Respostas

yorgan

Da uma olhada aqui amigo, acho que vai te ajudar:
http://www.urubatan.com.br/implementando-login-com-jsf-exemplo-simples/
Para fazer o logout desse exemplo eu fiz um método para passar a variavel loginOk para false, daí ele não abre mais as páginas provadas.

Espero ter ajudado
Abraço

rbroz85

hum esse urubatan nao me ajudou mt na minha duvida nao !

como sou novo em JSF… tenho algumas duvidas

  1. eu posso ter mais de um Bean com o scope “session” ?
  2. o Bean do formulario do login pode ser “session” direto ?

eu tinha 2 Beans “FormBean” com scope “request” e o “SessionUser” com Scope “Session”

eu queria depois de validar no formBean… ele mandar as informações do usuario para o Bean SessionUser.

algo assim:

public String doLogin(){
        if(new ManagerUser().validateUser(name, pword)){
            UserSession use = new UserSession();
            use.setUser(new ManagerUser().getUser(name));
        }
        
        return "main";
    }

mas depois quando eu executo o seguinte cmando:

Enumeration e = session.getAttributeNames();
        while(e.hasMoreElements()==true){
            System.out.println(">>"+e.nextElement().toString());
        }

o traquinas so me mostra um atributo:

>>javax.faces.request.charset

como faço pro SessionUser ser um atributo da sessao tmb ?

abraços e obrigadu

Giulliano

Que tal vc implementar o login / logout da Especificação da Sun…

http://java.sun.com/javaee/5/docs/tutorial/doc/bncas.html

:wink:

rbroz85

blz… mas eu queria tirar minha duvida acima primeiro ! "/

obrigado

Giulliano

1 - Você pode ter tantos benas quanto necessário com o scopo de Sessão. É apenas uma questão de arquitetura, pois muitos beans na sessão serão mais dados que seu servidor precisará guardar em memória.

2 - O bean que recebe login e senha precisa ser session (no seu caso) pois não existe outro modo de resgatar esses dados para validar o login. Se colocar no escopo de request ele dura apenas uma chamada ao servlet. e se for escopo de aplicação o valor de login será o memso para todos os usários o que impossibilitaria saber se o usuário ATUAL esta logado.

Era isso ?

rbroz85

Era sim :smiley:
mt obrigado :smiley:

mais uma pergnta…

se o Bean que eu fiz o login esta em sessao e ele mesmo ja esta carregado de informações do usuario (nome, endereco, senha, … )

como que eu faço pra alterar alguma variavel dele ?

Giulliano

você precisaria ter colocado um objeto na memória da session. vc fez isso ?? Seria assim:

private HttpSession session = (HttpSession) context.getExternalContext().getSession(false); 

Usuario u = new Usuario;
u.setNome("Teste");

session.setAttribute("usuario",u); // Onde usuario é o nome dado para identificar seu session.

Aí vc faria:

Usuario u = (Usuario) session.getAttribute("usuario"); //aqui vc pega o objeto da sessão. Para alterar os valores seria necessário invalidar essa sessão e criar uma nova eu acho.
rbroz85

Hum… muito obrigado…

fiz assim e funcionou !
mt obrigado !

agora vou tentar resolver o problema do botao voltar do browser, pois quando eu deslogo , se eu voltar ele ainda apresenta as informaçoes e a pagina. que deveria ser apresentada somente quando estiver logada !

existe algum modo de resolver isso ?

Giulliano

Então se vc clica no botão voltar a página volta mesmo… :lol:

Se vc tentar alterar alguma coisa e dar um submit. Não vai funcionar, pois a sua sessão foi morta, os dados estão sendo apresentados apenas em cache. É seguro pois a pessoa q voltou não esta vendo nada que ela já não tivesse visto.

rbroz85

blz entao ! entao eu posso colocoar algo do tipo

if(!logado)
throw SecurityException();

entao quando o cara der o submit… vai dar erro ! ok ?

pode fazer isso ?

abs

rbroz85

nao tem como deixar isso altomatico ?
quandoo cara clicar em voltar… o navegador recuperar tudo dinovo. ao invez de dar um submit ??

eu usei esses metas e nao nao funcionou nada:

Criado 3 de março de 2008
Ultima resposta 4 de mar. de 2008
Respostas 11
Participantes 3