Login com níveis de acesso e Sessão

Olá a todos!
Primeiramente peço desculpas por voltar a um assunto com tantos tópicos já criados. Estou desenvolvendo
um crm-online para uma disciplina da faculdade. Preciso criar a tela de login com sessão e níveis de acesso.

Tenho 3 diretórios em meu sistema: Proprietário, Administrador, Usuário, cada um com um nivel de acesso diferente.
Li alguns topicos e vi alguns codigos para fazer isso acontencer.

Porém tenho dúvidas em criar a sessão e redirecionar o usuário para a pagina específica.

Segue os códigos

login.xhtml

[code]<h:form id=“form1”>
<p:growl id=“id” showDetail=“true” life=“4000” />

<h:panelGrid columns=“2” cellspacing=“9”>
<h:outputText value=“Usuário: " />
<p:inputText id=“login” value=”#{funcionarioBean.funcionario.login}"
required=“true” requiredMessage=“Informe o usuário”/>

                    <h:outputText value="Senha: " />
                    <p:password inline="true" 
                                id="senha" 
                                value="#{funcionarioBean.funcionario.senha}" 
                                required="true" 
                                requiredMessage="Informe a senha"/>

                    <br></br>
                    <br></br>
                    <p:commandButton id="btnO" 
                     value="Entrar" 
                     type="submit" 
                     actionListener="#{funcionarioBean.logar(e)}" 
                     ajax="false"
                     update="id"/>
                </h:panelGrid>
            </fieldset>
         </h:form>[/code]

FuncionarioBean

.
.
.
public void logar(ActionEvent e) throws ParseException, SQLException{
        
        FacesContext facesContext = FacesContext.getCurrentInstance();  
        
        RequestContext context = RequestContext.getCurrentInstance();  
        FacesMessage msg = null;  
        boolean loggedIn = false;  
          
        if(dao.Logar(funcionario)) {  
            
            HttpSession sessaoHttp = (HttpSession) facesContext.getExternalContext().getSession(true);  
            sessaoHttp.setAttribute("usuarioLogado", funcionario);  
            
            //loggedIn = true;  
            //msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bem Vindo", funcionario.getLogin()); 
            
        } else { 
            loggedIn = false;  
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Error ao Logar", "Dados Inválidos!"); 
        }  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
        context.addCallbackParam("loggedIn", loggedIn); 
    }
.
.
.

Bom ate aqui tudo bem, consigo verificar se o usuario existe e salva-lo em uma sessão, porém caso sim, não sei redireciona-lo para uma outra página…
Criei também um filtro com base em um tutorial que vi

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Controller;
    import Model.Funcionario;
    import java.io.IOException;
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

public class LoginFilter implements Filter {

private final static String FILTER_APPLIED = "_security_filter_applied";  

public LoginFilter() {  
}  

@Override  
public void init(FilterConfig arg0) throws ServletException {  
}  

@Override  
public void destroy() {  
}  

@Override  
public void doFilter(ServletRequest request, ServletResponse response,  
    FilterChain chain) throws IOException, ServletException {  
    HttpServletRequest hreq = (HttpServletRequest) request;  
    HttpServletResponse hresp = (HttpServletResponse) response;  
    HttpSession session = hreq.getSession();  

    hreq.getPathInfo();  
    String paginaAtual = new String(hreq.getRequestURL());  
    System.out.println(">>>>>>>" + paginaAtual);  

    if ((request.getAttribute(FILTER_APPLIED) == null)   
            && paginaAtual != null   
            && (!paginaAtual.endsWith("login.xhtml"))   
            && (paginaAtual.endsWith(".xhtml"))) {  
        request.setAttribute(FILTER_APPLIED, Boolean.TRUE);  

        String user = null;  
        if (((Funcionario) session.getAttribute("usuarioLogado")) != null) {  
            user = ((Funcionario) session.getAttribute("usuarioLogado")).getLogin();  
        }  

        if ((user == null) || (user.equals(""))) {  
            hresp.sendRedirect("login.xhtml");  
            return;  
        }  
        System.out.println(">>>>>> " + user);  

    }  
    // entrega a requisição para o proximo filtro    
    chain.doFilter(request, response);  
}  

}
[/code]

XML

[code]<?xml version="1.0" encoding="UTF-8"?>


javax.faces.PROJECT_STAGE
Development


Faces Servlet
javax.faces.webapp.FacesServlet
1

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>

<welcome-file-list>
    <welcome-file>login.xhtml</welcome-file>
</welcome-file-list>

<context-param>  
    <param-name>primefaces.THEME</param-name>  
    <param-value>cupertino</param-value>  
</context-param>
<filter>  
    <filter-name>Login Filter</filter-name>  
    <filter-class>Controller.LoginFilter</filter-class>  
</filter>  

<filter-mapping>  
    <filter-name>Login Filter</filter-name>  
    <url-pattern>login.xhtml</url-pattern>  
</filter-mapping>  
[/code]

Mesmo informando um usuário existente o sistema redireciona para a página de login.

oliveira_lb,

  É qualquer requisição na página do login.xhtml irá redirecionar para o login.
  Porque na função logar vc apenas seta na sessao que o usuario esta logado, como vc ira saber qual perfil ele tem para acesso as pastas?

att,
Diego

Então, sou leigo em java, jsf… Pensei em recuperar o nivel de permissão no banco depois de confirmar se o usuario existe,
crio if e else direcionando para a pasta especifica…
Nao sei se é a forma mais correta.
Tem outra solução?

Tranquilo Oliveira,

Faz o seguinte se você está trabalhando com permissão no banco

No filtro, realize a busca no banco conforme o usuario que vc setou na session.
Exemplo:

[code] if (((Funcionario) session.getAttribute(“usuarioLogado”)) != null) {
user = (Funcionario) session.getAttribute(“usuarioLogado”);
// BUSCA NO BANCO QUAL O PERFIL DO USUARIO

        }[/code]  

No retorno crie ifs para os niveis de usuario e conforme for o nivel vc redireciona para tal página

public void redirecionar(FacesContext context, String pagina) { NavigationHandler handler = context.getApplication().getNavigationHandler(); handler.handleNavigation(context, null, pagina + "?faces-redirect=true"); context.renderResponse(); }

att,
Diego

Obrigado.
Vou para a faculdade agora e na volta tentarei fazer conforme a sua sugestão.
Se não houver problema, consegue me fornecer o seu email? caso eu não consiga implementar a solução acima.

Aqui tem um exemplo de como fazer: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Ótimo material. Porém como eu disse anteriormente, estou iniciando em java agora, tem partes dos códigos que vi no seu material que não entendo.
Não consegui perceber onde e como implementa-lo no meu projeto.

Boa tarde pessoal.
Ainda não consegui implementar o sistema de login. Gostaria de ajuda.