Login/logout JSF, o que esta errado?

Boa tarde.

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

[code]
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”;
}
}[/code]

    <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 !

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

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

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

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

:wink:

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

obrigado

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 ?

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 ?

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.

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 ?

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.

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

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: