2009-07-16 9 views
1

J'ai demandé un bean de sauvegarde pour la page de connexion (j'utilise Spring Security). Lorsque l'erreur d'authentification survient, Spring la met en contexte et j'essaye d'ajouter un message d'erreur à ma page.Ajout d'un message de la méthode dans JSF

public void doLogin() throws IOException { 
    final FacesContext context = FacesContext.getCurrentInstance(); 
    ExternalContext externalContext = context.getExternalContext(); 
    externalContext.dispatch("/j_spring_security_check"); 

    if (externalContext.getRemoteUser() == null) { 
     Exception loginError = (Exception) externalContext.getSessionMap().get(
       AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 
     if (loginError instanceof BadCredentialsException) { 
      externalContext.getSessionMap().put(
        AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY, null); 
      context.addMessage("loginBtn", new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid credentials!", null)); 
      context.responseComplete(); 
     } 
    } 

    context.renderResponse(); 
} 

ma page:

<a4j:form prependId="false"> 
     <h:panelGrid columns="2" cellpadding="5" > 
      <h:outputText value="#{msgs.login_username}"/> 
      <h:inputText id="j_username"/> 

      <h:outputText value="#{msgs.login_password}"/> 
      <h:inputSecret id="j_password"/> 

      <h:outputText value=" "/> 
      <f:facet name="footer"> 
       <h:panelGroup> 
        <h:commandButton type="submit" id="loginBtn" action="#{guest.doLogin}" value="#{msgs.login}" /> 
        <rich:spacer width="5" height="1"/> 
        <rich:message id="errorForLogin" for="loginBtn"> 
         <f:facet name="errorMarker"> 
          <h:graphicImage value="./resources/forbidden.gif"/> 
         </f:facet> 
        </rich:message> 
       </h:panelGroup> 
      </f:facet> 
     </h:panelGrid> 
     <br/><br/> 
    </a4j:form> 

Mais il est ne pas fonctionne. J'essaye de mettre l'erreur en affichant le code à la méthode @PostConstruct mais cela n'a pas aidé. Ce travail seulement si j'implémente mon PhaseListener mais je pense que c'est une mauvaise idée parce qu'il invoque à chaque demande. Quelle est mon erreur, il y a quelques façons d'ajouter un message d'erreur de la méthode, peut-être dans la méthode @PostConstruct?

Répondre

0

Vous pouvez l'approcher de l'autre côté. Lorsque vous utilisez SpringSecurity, vous pouvez sous-classer AuthenticationProcessingFilter et remplacer la méthode onUnsuccessfulAuthentication. Là, vous pouvez mettre le code pour le comportement souhaité. Ensuite, il vous suffit de spécifier votre classe de filtre de traitement d'authentification personnalisée au lieu de AuthenticationProcessingFilter dans la définition de bean correspondant pour Spring Security.

Questions connexes