PhaseListener

3 respostas
oliveira_lb

Boas pessoal, tudo bem com vocês?
Criei um PhaseListener e preciso que o mesmo "bloqueie" apenas paginas de um diretorio específico.
Tenho dentro da raiz de paginas de meu projeto (PASTA WEB) a tela de login e cadastro, dentro desta mesma raiz tenho uma pasta privada, que deve
ser protegida com o PhaseListener.
O codigo que tenho nao me permite acessar a pagina cadastro, ele sempre me redireciona para a pagina de login.
Como posso alterar ou o que devo fazer para que seja protegida somente a pasta privada?

faces-config.xml
<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.1"
    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-facesconfig_2_1.xsd">

    <navigation-rule>
        <from-view-id>/Pages/*</from-view-id>
        <navigation-case>
            <from-outcome>loginPage</from-outcome>
            <to-view-id>/login.xhtml</to-view-id>
        </navigation-case>
    </navigation-rule>
    
    <lifecycle>
        <phase-listener>Filter.AuthorizationListener</phase-listener>
    </lifecycle>
</faces-config>
AuthorizationListener.java
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Filter;

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpSession;

public class AuthorizationListener implements PhaseListener {

    @Override
    public void afterPhase(PhaseEvent event) {

        FacesContext facesContext = event.getFacesContext();
        String currentPage = facesContext.getViewRoot().getViewId();

        boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);
        HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
        Object currentUser = session.getAttribute("usuarioLogado");

        if (!isLoginPage && currentUser == null) {
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
            nh.handleNavigation(facesContext, null, "login.xhtml");
        }
    }

    /**
     *
     * @param event
     */
    @Override
    public void beforePhase(PhaseEvent event) {
    }

    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }
}

3 Respostas

G

Te aconselho a utilizar Spring Security para isso.
Mas como você esta fazendo altere a linha:

boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);

Por algo do tipo:

boolean pagePublic = (currentPage.lastIndexOf("/public/") > -1);

É um exemplo porco, mas é só questão de lógica.
Tu só pode fazer entrar no if abaixo, se o usuário não estiver na pasta public.

if (!pagePublic && currentUser == null) {  
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();  
            nh.handleNavigation(facesContext, null, "login.xhtml");  
        }

[]'s

oliveira_lb

grinche:
Te aconselho a utilizar Spring Security para isso.
Mas como você esta fazendo altere a linha:

boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);

Por algo do tipo:

boolean pagePublic = (currentPage.lastIndexOf("/public/") > -1);

É um exemplo porco, mas é só questão de lógica.
Tu só pode fazer entrar no if abaixo, se o usuário não estiver na pasta public.

if (!pagePublic && currentUser == null) {  
            NavigationHandler nh = facesContext.getApplication().getNavigationHandler();  
            nh.handleNavigation(facesContext, null, "login.xhtml");  
        }

[]'s

Funcionou perfeitamente. Mais uma duvida… Quando tento acessar as paginas privadas sou redirecionado para a tela de login, porém não consigo recuperar
o css que criei para a pagina login ficando a mesma toda desconfigurada.
Tem como resolver isso?

lreao

Tem que dar permissão nos arquivos do diretório do css!! Pode fazer isso da mesma forma que dá permissão as páginas!!!
Exemplo: /resources/css/default.css

Espero ter ajudado!

Criado 19 de outubro de 2012
Ultima resposta 21 de nov. de 2012
Respostas 3
Participantes 3