Dúvida com PhaseListener em JSF

Bom dia!

Estou desenvolvendo um controle de perfil em JSF utilizando o PhaseListener para validação de acessos do usuário.

Estou utilizando o Método afterPhase da classe implementada PhaseListener.

Eu utilizo o método abaixo para pegar a visão atual do sistema:

[code]String currentPage = facesContext.getViewRoot().getViewId();				[/code]

Com esse método o sistema armazena em currentPage o valor da visão jsp atual. Agora vem minha dúvida:

Como consigo armazenar a próxima visão sem que meu ciclo de vida esteja concluído???

Alguém já desenvolveu um sistema de perfil em JSF utilizando PhaseListener???

Obrigado…

Tem um exemplo de como utilizar phaseListener em JSF no meu blog.
Espero que ajude. :wink:

http://www.rodrigolazoti.com.br/?p=56

[]'s

:slight_smile: foi bem do seu blog que eu aprendi como utilizar PhaseListener!!! :slight_smile:

Mas seguindo os passos que você postou, no qual funcionam perfeitamente, eu descobri que o método getViewId() pega a página atual da requisição, ou seja, “home.jsp”, para entrar em uma página de cadastro que seria “cadastro.jsp”, minha dúvida é: Como saber que a página na qual meu cliente está requisitando através de “home.jsp” é “cadastro.jsp” ? Pois o PhaseListener vai buscar em seu perfil se esse cliente tem acesso ou não, como eu faria isso?? Eu ia mandar essa pergunta em seu blog :slight_smile: mas como te encontrei aqui no guj ficou ainda mais fácil!!

Parabés pelo seu blog…

Já tentou usar beforephase ao inves de afterphase???

  • ou - assim:

[code]…beforephase(){

if(getViewId() == “produtos.jsp”
faz.verificacao.de.permissao;

}[/code]

No método afterPhase(PhaseEvent pe) no pe.getPhaseId(), quando o phaseId for APPLY_REQUEST_VALUES (2) ele informa a pagina de origem e mantém até executar o UPDATE_MODEL_VALUES (4)

A proxima fase INVOKE_APPLICATION (6) do afterPhae(PhaseEvent pe) ele já retorna o destino (próxima página).

A txans é que nesta fase no beforPhase(PhaseEvent pe) se vc pegar pe.getPhaseId() == INVOKE_APPLICATION vc pegará quem está chamando (pelo menos no meu teste).

Se vc for utilizar somente o afterPhase, capture a origem no APPLY_REQUEST_VALUES e o destino no RENDER_RESPONSE.

Deve funfar. Se te ajudar, posta ae.

Valew a ajuda galera!!!

Mas implementei o berforePhase mesmo e mudei o retorno do método PhaseID para PhaseID.RENDER_RESPONSE, assim o metódo vai pegar a página de resposta do meu ManagedBean e não a de requisição.

Obrigado a todos…

Bom dia dahenz,

       A muito venho tentando criar em meu aplicativo web, um esquema de autorização e autenticação, mas não estou conseguindo por ser iniciante em Java.

       Já tentei LDAP com servidor OpenDS, já tentei JAAS e não obtive êxito.

       Eu li sobre o PhaseListener (utilizando filtros), parece que isso seria a solução pra mim.

       Eu trabalho com Glassfish + Netbeans + ICEFaces. 

       Entrei na página do [url]http://www.rodrigolazoti.com.br/?p=56 [/url] para ver o exemplo, mas não tem a página de Login e o Bean onde é colocado o usuário logado em sessão. Não sei como fazer isso.

       Você poderia me ensinar como fazer um esquema desses a partir da criação de uma página de Login ?

Olá pessoal,

Eu criei uma classe (utilizando filtro) para autenticar usuários no meu sistema. A lógica funcionou, só que tem um problema pra resolver. No meu sistema, existirá usuários que terão permissão para acessar diversas páginas e outros não.

Algum colega poderia me ensinar a criar ROLES para autorização de usuários a determinadas páginas utilizando o mesmo esquema de filtro que desenvolvi ???

Veja o exemplo da classe abaixo que fiz:

 public class AuthorizationListener implements PhaseListener {  
    
     public void afterPhase(PhaseEvent event) {  
    
          FacesContext facesContext = event.getFacesContext();  
          String currentPage = facesContext.getViewRoot().getViewId();  
    
          boolean isLoginPage = (currentPage.lastIndexOf("Login.jsp") > -1);  
          HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);  
          Object currentUser = session.getAttribute("currentUser");  
   
         if (!isLoginPage && currentUser == null) {  
              NavigationHandler nh = facesContext.getApplication().getNavigationHandler();  
              nh.handleNavigation(facesContext, null, "loginPage");  
          }  
       }  
     
      public void beforePhase(PhaseEvent event) {  
      }  
     
      public PhaseId getPhaseId() {  
          return PhaseId.RESTORE_VIEW;  
      }  
  }  

faces-config.xml :

     <navigation-rule>  
         <from-view-id>/*</from-view-id>  
         <navigation-case>  
             <from-outcome>loginPage</from-outcome>  
             <to-view-id>/Login.jsp</to-view-id>  
         </navigation-case>  
     </navigation-rule>  
   
     <lifecycle>  
         <phase-listener>com.corejsf.AuthorizationListener</phase-listener>  
     </lifecycle>  

[quote=rlazoti]Tem um exemplo de como utilizar phaseListener em JSF no meu blog.
Espero que ajude. :wink:

http://www.rodrigolazoti.com.br/?p=56

[]'s[/quote]
Olá Rodrigo, td bem??

Meu amigo, eu vi o seu exemplo e é mto bom, mas estou com um problema na implementação do meu código:
Ele está filtrando direitinho as requisiçoes, mas a partir do momento que o usuário loga no sistema e acessa a pagina principal, eu nao consigo mais acessar nenhuma página dentro dela. Quando eu vou clicar em outra jsp ou tento acessa/gravar no banco, ele me redireciona para a pagina de login.

O que pode ser isso??
Agradeço a atençao.
Minha authorizationListener:

[code]package br.gov.rr.setrabes.util;

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;

import br.gov.rr.setrabes.estrutura.Usuario;

public class AuthorizationListener implements PhaseListener {

private static final long serialVersionUID = 1L;

public void afterPhase(PhaseEvent event) {
	System.out.println(event.getPhaseId());

	FacesContext facesContext = event.getFacesContext();
	String currentPage = facesContext.getViewRoot().getViewId();
	System.out.println("PAGINA DE DESTINO after: " + currentPage);

	boolean isLoginPage = (currentPage.lastIndexOf("login.jsp") < -1);
	HttpSession session = (HttpSession) facesContext.getExternalContext()
			.getSession(true);
	System.out.println("=======validado a página=======");
	Usuario currentUser = (Usuario) session.getAttribute("currentUser");

	if (!isLoginPage && currentUser == null) {
		NavigationHandler nh = facesContext.getApplication()
				.getNavigationHandler();
		System.out.println("<-------condicao lançada-------->");
		nh.handleNavigation(facesContext, null, "loginPage");
		System.out.println("<-------usuario nao logado-------->");
	} else {
		FacesContext.getCurrentInstance().getExternalContext()
				.getSessionMap().put("currentUser", currentUser);

		System.out.println("========leu o else=========");
	}
}

public void beforePhase(PhaseEvent event) {
	System.out.println("PRINT DE IDENTIFICAÇÃO DO EVENTO before: "
			+ event.getPhaseId());
}

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

}[/code]

Eae, alguem responde??
Alguem pode ajudar?? Ou só eu que estou achando dificil isso??

Valeu

Mesmo problema!!!

O problema de vocês deve estar na lógica de login, vocês devem estar verificando os dados informados no login mas redirecionando para o menu eles estando corretos ou não. Então como o phaseListner valida todas as requisições, ao tentarem fazer uma nova requisição vocês não passam na validação e são redirecionados para o login.

Eae Jefferson, blz??

Tá ressucitando tópicos? rsrsrs

cara, já resolvi esse problema a bastante tempo… não sei se os colegas resolveram. Mas qualquer coisa, posta ae que a gente ajuda.

Flws.

Acho que depois de 3 anos com o problemas resolvido, vocês poderiam me ajudar… rs

Eu estou migrando minha aplicação e um dos pontos é mudar do Struts 1.3 para o JSF… estou trabalhando três dias para entender o JSF e começar a migrar pelo inicio… LOGIN… eu acho que entendi como o funciona o PhaseListener… o login já está funcionando, coloco o user na sessão, recupero, vejo se está tudo ok e redireciono para a próxima pagina… o problema é quando vou sair da sessão e voltar para a index.jsp ? ele funciona e volta, mas perde as configurações do css… e eu sei que é algum problema no PhaseListener porque isso só acontece quando eu configuro ele no meu faces-config
Alguém poderia me dar alguma luz?

Preciso implementar controle de acessos usando Phaselistener para impedir o usuário de logar 2 vezes no sistema seja através de outra aba, browser ou pc, alguem tem algum exemplo? É possível fazer isto usando phaselistener?