alberto_ribeiro
Cara, sua resposta não foi bem o que eu queria, pois tem alguns comandos que eu não entendi:
ELResolver elResolver = fc.getApplication().getELResolver();
LoginHandler loginHandler = (LoginHandler) elResolver.getValue(fc.getELContext(), null, "loginHandler");
E você importou duas classes externas, nas quais eu não faço a menor idéia de como foram implementadas :roll:
import br.com.cotacao.handlers.LoginHandler;
import br.com.cotacao.util.MensagensUtil;
Mas o importante é que seu código me ajudou a formular outro que vi nesse link: http://www.rodrigolazoti.com.br/pt/2008/09/01/filtrando-usuarios-logados-em-jsf-com-phaselistener/
E assim eu consegui fazer uma lógica que eu entendesse e deu certo aqui :lol:
Eu estava achando que o PhaseListener só executava após o usuário dar um submit em algum formulário :lol:
Mas vi que me enganei… subestimei o JSF? :shock:
Bem, aqui está minha classe que verifica se a página requisitada pode ser acessada. Nesse caso, só dá certo com uma página. Para fazer com mais, eu precisaria de
armazenar todas em um vetor, fazer um forit para um objeto, e comparar se esse objeto não é nulo lá no meu if? ou tem alguma maneira mais fácil?
package meuProjeto.jsf;
import meuProjeto.beans.Admin;
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.HttpServletRequest;
public class Autorizador implements PhaseListener{
public void afterPhase(PhaseEvent event) {
FacesContext fc = event.getFacesContext(); //pego o contexto do Faces
String currentPage = fc.getViewRoot().getViewId(); // armazeno numa String o id da minha página que está sendo requisitada
boolean isRequisitedPage = (currentPage.lastIndexOf("/admin.xhtml") > -1); // verifico se a página requisitada é a admin
HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); // instancio um request
Admin admin = (Admin)request.getSession().getAttribute("admin"); // pego o meu objeto admin da sessão
if(isRequisitedPage && admin == null){ //verifico se a página requisitada é a admin
NavigationHandler nh = fc.getApplication().getNavigationHandler(); // instancio um objeto de navegação
nh.handleNavigation(fc, null, "loginPage"); // passo o contexto do Faces, null para minha action, e loginPage como from-outcome
fc.renderResponse(); // chamo a última fase do ciclo de vida
}
}
public void beforePhase(PhaseEvent event) {
}
public PhaseId getPhaseId() {
return PhaseId.RESTORE_VIEW;
}
}
Aqui parte do faces-config:
<navigation-rule>
<from-view-id>/*</from-view-id>
<navigation-case>
<from-outcome>loginPage</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<application>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
</application>
Valeu, muito obrigado mesmo… 