Login com JSF + Spring Security 5 FacesContext.getCurrentInstance() null

Bom dia, estou implementando uma tela de login com JSF e Spring Security 5, e estou com um problema na validação de mensagens quando o usuário digita usuário ou senha inválidos.

Ao clicar no botão logar o método loadUserByUsername é chamado:

public class UsuarioSistemaService implements UserDetailsService {
      @Override
      public UserDetails loadUserByUsername(final String login) throws UsernameNotFoundException {
           msgFeedback(null, mensagem, severity);
       }
    }

public void msgFeedback(String tagIdent, String mensagem, Severity severity) {

		FacesMessage facesMessage = new FacesMessage(severity, mensagem, mensagem);

		FacesContext facesContext = FacesContext.getCurrentInstance();
		facesContext.addMessage(tagIdent, facesMessage);
		FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);	
	}

o problema ocorre quando eu tento enviar uma mensagem de usuário ou senha inválidos para a tela, o facesContext sempre vem null.

Eu tenho o seguinte PhaseListener na minha aplicação e configurado no faces-config.xml,
mas mesmo assim não funciona, como posso resolver esse problema?

public class PhaseListener implements PhaseListener {

	private static final long serialVersionUID = -3155148099818905433L;

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

	}

	@Override
    public void beforePhase(PhaseEvent event) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        if (session != null) {
            String mensagem = (String) session.getAttribute("msg");
 
            if (mensagem != null) {
                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, mensagem, null));
                session.setAttribute("msg", null);
            }
        }
    }
 
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.RESTORE_VIEW;
    }

}

Boa tarde, eu tentaria de duas maneiras.
1)

FacesContext facesContext = FacesContext.getCurrentInstance();
facesContext.addMessage(tagIdent, facesMessage);
facesContext.getExternalContext().getFlash().setKeepMessages(true);	

Se não der certo, tenta desse jeito:
2)Aqui usaremos CDI. Cria um atributo FacesContext facesContext e anota com @Inject

public MyClass{
@Inject
private FacesContext facesContext;
}

Depois cria uma classe que vai ser responsável por “produzir” o FaceContext

public class FacesContextProducer
{
   @RequestScoped
   @Produces
   public FacesContext getFacesContext()
   {
      return FacesContext.getCurrentInstance();
   }
}

Agora você nao precisa ficar mais dando getCurrentInstance em nenhum lugar, apenas: facesContext.algumMetodo();

O @Inject dará um instancia automaticamente.

facesContext.addMessage(tagIdent, facesMessage);
facesContext.getExternalContext().getFlash().setKeepMessages(true);	

Boa tarde @Mike, tentei das duas formas mas mesmo assim o facesContext ainda vem null.

Agora que percebi…
Você só pode obter uma instancia de FacesContext se você estiver num ManagedBean.

A sua classe é um Service, logo irá retornaá null mesmo.

Eu tentei anotar ela como bean usando a anotação Named já que estou usando cdi e mesmo assim o facescontext me retorna null.