PhaseListener

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

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

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

AuthorizationListener.java

[code]/*

  • 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;
}

}
[/code]

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

[quote=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[/quote]

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?

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!