JSF2 FaceSMessage для весенней безопасности BadCredentials - PullRequest
0 голосов
/ 24 декабря 2011

Я использую форму входа в Facelets для Spring Security:

<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")

Это отлично работает, но как я могу отобразить лицо лица в моем теге h: messages, если Spring Security выдает исключение BadCredentials?

Я знаю, что это можно сделать с помощью слушателя фазы, но мне не нравится этот способ (работа с исключениями в слушателях).

Я пытаюсь по-другому настроить Spring Security следующим образом:

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

А затем на странице входа поймайте параметр GET «ошибка». Но как я могу показать сообщение лица таким образом?

Другой способ, которым я пытался, - переопределить файл свойств сообщений Spring Security (переопределяя сообщение для ключа «badcredentials»), но он также не работал (я не знал, как показать сообщение). 1016 *

Кто-нибудь знает, как это сделать?

Заранее большое спасибо.

1 Ответ

1 голос
/ 24 декабря 2011

А затем на странице входа поймайте параметр GET "ошибка".Но как я могу показать сообщение лица таким образом?

Таким образом:

<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"));
    }
}

или может быть так:1013 *

<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"));
    }
}

В любом случае, это выглядит довольно забавно:)

...