Dúvida com PhaseListener em JSF

14 respostas
D

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:

String currentPage = facesContext.getViewRoot().getViewId();

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.....

14 Respostas

R

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

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

[]'s

D

: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…

A

Já tentou usar beforephase ao inves de afterphase???
+ ou - assim:

..beforephase(){

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

}
Z

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.

D

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…

L

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.

        tentei LDAP com servidor OpenDS,  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 ?
L

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>
K
rlazoti:
Tem um exemplo de como utilizar phaseListener em JSF no meu blog. Espero que ajude. :wink:

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

[]'s


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

}
K

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

Valeu

B

Mesmo problema!!!

J

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.

K

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.

B

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?

R

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?

Criado 30 de março de 2009
Ultima resposta 26 de fev. de 2014
Respostas 14
Participantes 10