Qual a melhor forma de implementar um filtro de login utilizando JSF?

Bom dia meus caros amigos, eu andei dando uma olhada em algumas formas de filtrar o usuario logado e tudo mais e vi o seguinte: Tinha uma pessoa que utilizada um filtro normal, ou seja, uma classe que implementa o filter de servlet.

Exemplo:


public class Login {
private String nome; //get/set
 private String senha;  //get/set

public String checkLogin() throws Exception {

FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fc.getExternalContext().getSession(false);

if( nome != null && nome.equals("faces") && senha != null && senha.equals("123") ){
            session.setAttribute("NOME", getNome() );

            return "success";

        }else{

            addMessage("INFORMAÇÕES INCORRETAS!!!");

            return "failure";

        }

    }}

e eu vi uma outra pessoa, utilizando dentro do ciclo de vida do jsf desta forma:


public class LifeCycleListener implements PhaseListener {

	/**
	 * Serial Version UID.
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * Após a execução da fase.
	 */
	public void afterPhase(PhaseEvent fase) {
		System.out.println("AfterPhase: " + fase.getPhaseId());
	}

	/**
	 * Antes da execução da fase.
	 */
	public void beforePhase(PhaseEvent fase) {
		System.out.println("BeforePhase: " + fase.getPhaseId());

		if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {

			LoginMBean loginMBean = (LoginMBean) FacesContextComum
					.getSessionAttribute("loginMBean");
			if (loginMBean == null || !loginMBean.getAutenticado()) {
				FacesContextComum.setNavegacao("login");
			}
		}

	}

	/**
	 * Informa o identificador da fase.
	 */
	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
	}

Bem, essa forma dentro do ciclo de vida eu não gostei muito. Gostaria da opinião de vocês em questão de segurança. Qual seria uma boa solução para isso ?