Login com níveis de acesso e Sessão

7 respostas
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
<h:form id="form1">  
                <p:growl id="id" showDetail="true" life="4000" />
                <fieldset>
                    <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>
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

/*
 * 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);  
    }  
}
XML
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <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>

  <!-- Filtro para identificar se o usuário está logado -->  
    <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>  
</web-app>

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

7 Respostas

D

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

O

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?

D

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:

if (((Funcionario) session.getAttribute("usuarioLogado")) != null) {  
                 user = (Funcionario) session.getAttribute("usuarioLogado");
                 // BUSCA NO BANCO QUAL O PERFIL DO USUARIO
                 
            }

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

O

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.

H

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

O

Ó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.

O

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

Criado 10 de outubro de 2012
Ultima resposta 12 de out. de 2012
Respostas 7
Participantes 3