我为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>
任何人都知道怎么做?
非常感谢你。
答案 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:)