Perdendo sessão depois da primeira pagina, usando PhaseListener

Estou com um problema a algum tempo já li muitos tutorias e procurei no fórum, mas sempre chego ao mesmo ponto e não consigo achar qual é o meu erro ou a maneira certa de implantar o PhaseListener.

Consigo logar e acessar a primeira pagina, mas depois da primeira pagina se eu acessar qualquer outra, a sessão retorna nula e é criado uma nova sessão.

Eu reduzi o código, removi todas as validações e logica para simplificar, ficarei muito grato se alguém puder me ajudar pois esta difícil, chegou em um ponto que preciso implantar o controle de pagina e gostaria de usar o PhaseListener.

Minha classe PhaseListener:

public class AuthorizationListener implements PhaseListener {

private static final long serialVersionUID = 1L;

public void afterPhase(PhaseEvent event) {

	FacesContext facesContext = event.getFacesContext();

	String currentPage = facesContext.getViewRoot().getViewId();
	boolean isLoginPage = (currentPage.lastIndexOf("login.xhtml") > -1);

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

	String currentUser = "";
	if (retornoUser != null) {
		currentUser = retornoUser.toString();
	}
			
	Logger.getLogger("HIPERAPP").log(Level.INFO, "1 > \nPagina " + currentPage + "\nUsuario: "
			+ currentUser + "\nRetorno: " + isLoginPage + "\n" + "Id: " + session.getId() + "\n");
}

public void beforePhase(PhaseEvent event) {
}

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

}

Minha classe de login:

   @Named("login")

@SessionScoped
public class Login implements Serializable {

private static final long serialVersionUID = 1L;

// private Usuarios usuarios;

private String usuario;
private String senha;

public String efetuaLogin() {

	FacesContext context = FacesContext.getCurrentInstance();
	HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
	
	session.setAttribute("currentUser", usuario);

	return "principal?faces-redirect=true";
}

public String getSenha() {
	return senha;
}

public void setSenha(String senha) {
	this.senha = senha;
}

public String getUsuario() {
	return usuario;
}

public void setUsuario(String usuario) {
	this.usuario = usuario;
}

}

Dentro do faces-config coloquei:

     <lifecycle>
	<phase-listener>com.aramo.app.classes.AuthorizationListener</phase-listener>
</lifecycle>

Quanto acesso a pagina de login, coloco o usuario e senha, tenho essa saida:

18:42:59,505 INFO  [app] (default task-9) 1 > 

Pagina /login.xhtml
Usuario:
Retorno: true
Id: BaVOKxfKqzG3YypQDrASd8Wd5OHqzm6NRUHiB0XA

18:43:01,863 INFO [app] (default task-9) 1 >
Pagina /login.xhtml
Usuario:
Retorno: true
Id: BaVOKxfKqzG3YypQDrASd8Wd5OHqzm6NRUHiB0XA

18:43:01,871 INFO [app] (default task-9) 1 >
Pagina /principal.xhtml
Usuario: anderson
Retorno: false
Id: BaVOKxfKqzG3YypQDrASd8Wd5OHqzm6NRUHiB0XA

Ao clicar em qualquer outra pagina recebo essa saida:

18:44:04,092 INFO  [HIPERAPP] (default task-9) 1 > 

Pagina /listaAgente.xhtml
Usuario:
Retorno: false
Id: Y2C-aFm5uaEQ3hHlLi3MIjD9NH6cjPMMhVftk3vi

E nesse momento que vem o problema, que é criado uma nova sessão.

Hoje novamente estou tentando resolver essa questão.
O problema é exatamente quando faço um redirecionamento ex. “principal?faces-redirect=true.”

troquei a linha na classe AuthorizationListener

session.getAttribute(“currentUser”);
por
facesContext.getExternalContext().getApplicationMap().get(“currentUser”);

e na classe de login setei o valor na seção da seguinte forma.
FacesContext.getCurrentInstance().getExternalContext().getApplicationMap().put(“user”, usuario);

Nesse momento não perco mais o usuário, mas como estou buscando dentro do servidor o valor se torna estático.

Ex. Se eu logar como Anderson o valor fica em memoria, mas se eu abrir outro browser e logar como teste, ele assume o valor de teste sobrescrevendo o Anderson.

Hoje também tentei com o Filtre ao invés de Phase, mas acontece a mesma questão, sei que no momento que você faz um redirect, esta dizendo para o browser limpar todos os atributos, mas nesse caso como consigo fazer esse controle de permissão?

Alguém teria alguma ideia e pode me dar uma luz?
Obrigado!

Olá @anderluizp

Acredito que o problema esteja no método efetuarLogin.
Troque o false por true no getSession

Outro jeito de fazer inserções na sessão é assim:

FacesContext.getCurrentInstance()
    .getExternalContext()
    .getSessionMap()
    .put("chave", valor);

Outra coisa que você pode fazer, é setar o seu usuario logado dentro do seu bean de sessão e pegar o usuario através de injeção de dependencia:

@Inject
private LoginBean loginBean;

O código acima pegará a instancia viva de loginBean que esta na memoria

O código acima funcionou pra você pq você não esta mais adicionando na sessão de cada usuário (browser, client), mas sim na aplicação toda, logo cada browser/cliente enxergará esse valor que você setou.

IMPORTANTE: Como você esta utilizando CDI, verifique se você esta importando o SessionScoped do pacote correto.
O pacote tem que ser esse:

import javax.enterprise.context.SessionScoped;

Ola @Mike,

Fiz as alterações que se referiu, também tentei fazer um bean de sessão.

Mas o problema acontece igual, no momento que eu logo e assim que é direcionado eu perco o usuário. Eu li que assim que faz um:

faces-redirect=true

A sessão é perdida juntos com seus tributos e uma nova sessão é iniciado, isso realmente acontece e se sim como faço para manter a sessão ou pelo menos manter o atributo usuário?

Já li diversos casos, mas realmente cheguei em ponto que não consigo entender! Se puder me ajuda agradeço muito!!

Faz um tempo que eu não mexo mais com JSF, mas me recordo que ele apenas limpa os dados de uma requisição, ou seja, ele não chega a matar a sessão

Se reparar na saída do log ele troca o id da sessão, e nesse momento acredito ser uma outra sessão.

Já estou dias tentando entender e não consigo. Agradeço a ajuda!