Bom dia amigos!
Estou tentando utilizar um phase listener que um amigo me passou para fazer controle de acessos em minha webapp. Porém não entendi muito bem como tudo funciona. Estou postando a classe LoggedInCheck (phase listener) e a configuração do faces-config.xml da maneira que recebi. Minha dúvida é como configuro para que funcione corretamente com minha webapp? Em minha webapp tudo que usuários do tipo “aprovador” (existem os tipos aprovador, digitador e adm) podem acessar está em um pacote Aprovador, seguindo a mesma linha para digitador e adm. Sendo que o adm deve ter acesso a tudo, o aprovador acessa a tudo menos o conteudo do pacote Adm e o digitador apenas ao pacote digitador. Além disso alguns jsp’s estão fora dos pacotes e podem ser acessados por todos que estejam logados.
Bom, se alguém já tiver usado algo parecido ou poder dar uma olhada e ajudar, ficarei imensamente grato!
Configuração do faces-config.xml:
<lifecycle>
<phase-listener>lifecycle.LoggedInCheck</phase-listener>
</lifecycle>
<navigation-rule>
<from-view-id>*</from-view-id>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Classe LoggedInCheck:
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;
@SuppressWarnings("serial")
public class LoggedInCheck implements PhaseListener {
public PhaseId getPhaseId() {
// return PhaseId.RESTORE_VIEW;
return PhaseId.ANY_PHASE;
}
public void beforePhase(PhaseEvent event) {
FacesContext facesContext = event.getFacesContext();
Boolean administracao = ((HttpServletRequest) facesContext
.getExternalContext().getRequest()).getRequestURI().indexOf(
"/jsf/faces/usr/") == 0;
Boolean login = ((HttpServletRequest) facesContext.getExternalContext()
.getRequest()).getRequestURI().indexOf("/jsf/faces/login.jsp") == 0;
Boolean logged = Boolean.TRUE;
if (administracao) {
logged = facesContext.getExternalContext().getSessionMap().get(
"usuario") != null;
}
Boolean administracaoA = ((HttpServletRequest) facesContext
.getExternalContext().getRequest()).getRequestURI().indexOf(
"/jsf/faces/adm/") == 0;
Boolean loginA = ((HttpServletRequest) facesContext
.getExternalContext().getRequest()).getRequestURI().indexOf(
"/jsf/faces/login.jsp") == 0;
Boolean loggedA = Boolean.TRUE;
if (administracaoA) {
loggedA = facesContext.getExternalContext().getSessionMap().get(
"adm") != null;
}
if (!loginA && !loggedA) {
facesContext.getApplication().getNavigationHandler()
.handleNavigation(facesContext, null, "logout");
}
if (!login && !logged) {
facesContext.getApplication().getNavigationHandler()
.handleNavigation(facesContext, null, "logout");
}
}
public void afterPhase(PhaseEvent event) {
}
}
Desde já agradeço!