PhaseListener para Login

Bom tenho um phaseListener que cuida das requisições da aplicação, o problemas é que ele não retorna o usuário que foi colocado na sessão, então sempre sou remetido a tela de login novamente.


public class AutorizationListener implements PhaseListener{
	
	private static final long serialVersionUID = 1L;

	@Override
	public void afterPhase(PhaseEvent event) {
		FacesContext facesContext = event.getFacesContext();
		String currentPage = facesContext.getViewRoot().getViewId();
		boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1 || currentPage.lastIndexOf("cadastroAluno.xhtml") > -1);
		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); 
		Object currentUser = session.getAttribute("aluno"); //AQUI ELE SEMPRE RETORNA NULL
		if ((!isLoginPage) && (currentUser == null)) {
			NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
			nh.handleNavigation(facesContext, null, "loginPage");
		}
	}

	@Override
	public void beforePhase(PhaseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

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

Estou setando o usuário desta maneira quando ele faz o login. O método funciona perfeitamente, verifica os dados no BD e vai a pagina welcome.jsf, todavia se o usuário tentar ir para qualquer outra página ele volta a página de login.

public String login(){
		AlunoDAO alunoDAO = new AlunoDAOImpl();
		Aluno temp = alunoDAO.verificaAluno(getAluno());
		FacesContext facesContext = FacesContext.getCurrentInstance();
		if(temp == null){
			FacesMessage facesMessage = new FacesMessage("Erro nos dados fornecidos");
			facesContext.addMessage("aviso", facesMessage);
			return "fracassoLogin";	
		}else{ 
			this.aluno = temp;
			this.aluno.setAlunochas(alunoDAO.carregaAlunoCompetencias(this.aluno)); 
			HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true); 
			session.setAttribute("aluno", this.aluno); //AQUI COLOCO O USER NA SESSÃO, MAS NAO CONSIGO RECUPERÁ-LO NO PHASE LISTENER
			facesContext.addMessage("bem-vindo", new FacesMessage("Bem-vindo, "+this.aluno.getNome().toUpperCase()));
			return "welcome";
		}
	}

Alguém poderia me ajudar com tal problema?

[]s

A sua linha 5…

if(temp == null){  

pode estar retornando true.
experimente…

if(temp.getCodigo == 0){  

se não funcionar, poste aqui o seu código do método alunoDAO.verificaAluno pois o erro pode estar nele.

o meu phaselistener está assim na parte q trata o login:

if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) { // recupera da sessão o MB loginbean LoginBean loginBean = (LoginBean) FacesContextUtil.getSessionAttribute("loginBean"); if(loginBean == null || !loginBean.getAutenticado()){ FacesContextUtil.setNavegacao("login"); } }

oliversistemas, a parte do login esta funcionando perfeitamente o problema é que não consigo recuperar o aluno no phaseListener

luxu, tentarei usar a sua versão para o phase e dou resposta logo que testá-la.

Vc adicionou no “faces-config.xml” isto: ?

<lifecycle> <phase-listener>nomeDoPacote.AuthorizationListener</phase-listener> </lifecycle>

sim coloque isso no faces-config.xml,

O problema é que nao consigo recuperar da sessao o usuario novamente, nao sei se isso seria um problema do tomcat7.
Isso começou a surgir do nada, nem sei o que fazer, ele sempre retorna null quando faço esse comando, alguem tem uma ideia do que pode ser?

 HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
Object currentUser = session.getAttribute("aluno");

O problema não está na fase que você está usando no seu PhaseListener?
Pelo que eu sei, o método login() só será executado na fase UPDATE_MODEL.
O objeto usuário ainda não existe na fase RESTORE_VIEW, por isso o PhaseListener retorna null.
Tenta mudar a fase pra UPDATE_MODEL e vê o que acontece.