Colocar usuário na sessão JSF

Olá pessoal,

estou usando um filtro na minha aplicação, mas estou com uma dúvida… Preciso colocar o usuário que digitou seu login no sistema na sessão para que eu posso recuperar seus dados posteriormente.

Usando desta maneira como eu faço pra recuperar o usuário da sessão? MB: [code]public String login() throws Exception {
boolean logado = false;
PessoaDAO dao = new PessoaDAO(session);

	HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
	HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

	// verifica se o login/senha estao corretos
	logado = dao.isValidLoginAndPassword(this.loginEmail, TransformaStringMD5.md5(senha));
	
	if(logado){
		ses.setAttribute("user", logado);
		rp.sendRedirect("../../pages/principal/principal.faces");
		
		return "toPrincipal";
	}else{
		ses.setAttribute("user", null);
		ses.removeAttribute("user");
		rp.sendRedirect("../../pages/login/login.faces");
		
		return "toLogin";
	}

}[/code] Filter: [code] public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest rq = (HttpServletRequest) request;
HttpServletResponse rp = (HttpServletResponse) response;

    boolean auth = rq.getSession().getAttribute("user") != null;
    
    if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {
        rp.sendRedirect("../../pages/principal/principal.jsf");
    } else {

        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}[/code]Agradeço antecipadamente!

Você pode jogar o objeto usuario na sessão e recuperá-lo sempre que precisar dessa maneira.

Para setar:

FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuario", objeto_usuario);

Para recuperar:

usuario = (Usuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");

Bom dia

Bom vou tentar explicar a forma que fiz a parte de autenticação utilizando jsf:

1º) Primerio quando o usuario relizar no form o input do login e senha, encaminhei esse processamento para um managed bean, nesse managed bean eu tinha um método reponsavel por ir no banco e realizar a validação.

Bom até ai não tem muito segredo, após a validação eu criei uma classe onde eu tinha os dados que eu precisava manter no ciclo de vida da sessão do usuario que estiver logado, então eu fiz um bean e coloquei ele em escopo de sessão (faces config) com isso essa classe que esta em escopo de sessão esta com os dados do login do usuario como login, nome, etc.

  1. Uma outra alternativa que vejo para vc é a utilização de um servlet para autenticação do usuario, assim ele jogaria os dados que vc precisa em escopo de sessão.

Espero ter ajudado.

Bom… parece que está funcionando.

Ficou redundante, mas funcionou. Coloquei o bean em escopo de Session.

MB: [code]public String login() throws Exception {
boolean logado = false;

	Session session = HibernateUtil.currentSession();
	PessoaDAO dao = new PessoaDAO(session);

	HttpSession ses = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);
	HttpServletResponse rp = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

        // verifica se o login/senha estao corretos
	logado = dao.isValidLoginAndPassword(this.loginEmail, TransformaStringMD5.md5(senha));

	if(logado){
		ses.setAttribute("user", logado);
		FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("user", dao.loadByEmail(this.loginEmail));  
		rp.sendRedirect("../../pages/principal/principal.faces");
		
		return "toPrincipal";
	}else{
		ses.setAttribute("user", null);
		ses.removeAttribute("user");
		rp.sendRedirect("../../pages/login/login.faces");
		
		return "toLogin";
	}
}[/code] Filter: [code]public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest rq = (HttpServletRequest) request;
    HttpServletResponse rp = (HttpServletResponse) response;
   
    boolean auth = rq.getSession().getAttribute("user") != null;
    
    if (!auth && !rq.getRequestURL().toString().contains("login.jsf")) {
        rp.sendRedirect("../../pages/principal/principal.jsf");
    } else {

        try {
            chain.doFilter(request, response);
        } catch (Exception e) {
            System.out.println("Exception no chain.doFilter");
            e.printStackTrace();
        }
    }
}[/code]

logout: [code]public String doLogout() {
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);

	//expira a sessão
	session.invalidate();

	FacesContext context = FacesContext.getCurrentInstance();  
	context.getExternalContext().getSessionMap().remove("user");  
	
	System.out.println("Logout!");
	System.out.println("Sobrou alguém na sessão? >>> " +  (Pessoa)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
	
	return "toLogin";	
}[/code]

Qual a diferença entre: [quote]ses.setAttribute(“user”, logado); // pra setar
ses.removeAttribute(“user”); // pra remover[/quote] e [quote]FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(“user”, dao.loadByEmail(this.loginEmail)); // pra setar
FacesContext context = FacesContext.getCurrentInstance();
context.getExternalContext().getSessionMap().remove(“user”); // pra remover[/quote]???