jsf2 facesmessage for spring-security badcredentials

时间:2011-12-24 02:14:24

标签: exception jsf-2 spring-security message

我为Spring Security使用facelets登录表单:

<h:messages globalOnly="true" layout="table" />
<h:form id="formLogin" prependId="false">
        <h:outputLabel for="j_username" value="Usuario:" />
        <h:inputText id="j_username" value="#{autenticacionController.administrador.login}" />
        <h:outputLabel for="j_password" value="Contraseña:" />
        <h:inputSecret id="j_password" value="#{autenticacionController.administrador.password}" />
        <h:commandButton value="Entrar" action="#{autenticacionController.loginAction}" />
        <h:commandButton value="Cancelar" immediate="true" action="#{autenticacionController.cancelarAction}" />
</h:form>`

loginAction方法使用以下命令转发请求:

FacesContext.getCurrentInstance().getExternalContext().dispatch("/j_spring_security_check")

它运行正常,但如果Spring Security抛出BadCredentials异常,如何在h:messages标记中显示facesmessage?

我知道可以使用阶段监听器来完成,但我不喜欢这种方式(处理侦听器中的异常)。

我正在尝试另一种方式,像这样配置Spring Security:

authentication-failure-url="/faces/paginas/autenticacion/login.xhtml?error=1

然后在登录页面中,抓住GET参数“错误”。但是我怎样才能以这种方式展示面孔消息呢?

我尝试的另一种方法是覆盖Spring Security的消息属性文件(覆盖密钥“badcredentials”的消息),但它既不起作用(我不知道如何显示消息)。 / p>

任何人都知道怎么做?

非常感谢你。

1 个答案:

答案 0 :(得分:1)

  

然后在登录页面中,抓住GET参数“错误”。但是如何以这种方式显示facesmessage?

这样:

<f:metadata>
    <f:viewParam name="error" validator="#{auth.checkErrors}" />
</f:metadata>
<h:messages />

public void checkErrors(FacesContext context, UIComponent component, Object value) {
    if ("1".equals(value)) {
        throw new ValidatorException(new FacesMessage("Invalid credentials"));
    }
}

或者可能如此:

<f:metadata>
    <f:viewParam name="error" value="#{auth.error}" />
    <f:event type="preRenderView" listener="#{auth.checkErrors}" />
</f:metadata>
<h:messages />

private int error;

public void checkErrors() {
    if (error == 1) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage("Invalid credentials"));
    }
}

无论哪种方式,这感觉非常hacky:)