2014-01-15 115 views
0

我使用這個鏈接教程:春季安全自定義錯誤消息沒有顯示

http://www.mkyong.com/spring-security/display-custom-error-message-in-spring-security/

要顯示的登錄表單自定義錯誤消息,我得到了它的開始。但聲明認證失敗處理程序-REF =「myAuthErrorHandler」自定義故障處理程序認證後,我看不出它的登錄表單的自定義消息:

enter image description here

我在做什麼錯誤?任何人都可以解釋我發生了什麼,爲什麼'無效的用戶名或密碼'不顯示?

下面的代碼:

AuthentificationListener

public class AuthentificationListener implements AuthenticationFailureHandler { 

@Override 
public void onAuthenticationFailure(HttpServletRequest request, 
     HttpServletResponse response, AuthenticationException ae) 
     throws IOException, ServletException { 

    UsernamePasswordAuthenticationToken user = (UsernamePasswordAuthenticationToken) ae 
      .getAuthentication(); 


    /* User */ 


    response.sendRedirect(request.getContextPath() 
      + "/abc/main/loginfailed"); 

} 

}

的applicationContext.xml:

<bean id="myAuthErrorHandler" class="org.abc.handler.AuthentificationListener"/> 

春季安全:

<http auto-config="true"> 
    <intercept-url pattern="/abc/main/welcome*" access="ROLE_USER" /> 
    <intercept-url pattern="/abc/main/record/**" access="ROLE_USER" /> 

    <form-login 

    login-page="/abc/main/login" 

    authentication-failure-handler-ref="myAuthErrorHandler" 

    default-target-url="/abc/main/welcome" 

    /> 


    <logout logout-success-url="/abc/main/logout" /> 

</http> 

的login.jsp:

 <c:if test="${not empty error}"> 
     <div class="errorblock"> 
      Your login attempt was not successful, try again.<br /> Caused : 
      ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 
     </div> 

    </c:if> 

LoginController.java:

@RequestMapping(value="/loginfailed", method = RequestMethod.GET) 
public String loginerror(ModelMap model) { 

    model.addAttribute("error", "true"); 
    return "login"; 

} 

更新:要回答的答案瑪尼,我m使用登錄控制器,其重定向loginfailed請求的login.jsp並正在發送「錯誤」與「」屬性的值。問題是我無法看到使用這種表達的login.jsp消息:

${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 

任何想法?非常感謝你!

回答

0

驗證失敗後,您要求重定向到不同的頁面。

response.sendRedirect(request.getContextPath() 
     + "/abc/main/loginfailed"); 

您的登錄失敗的jsp不顯示?它在登錄頁面中沒有像errorblock那樣的div?你在loginfailed.jsp中看到了不同的錯誤嗎?

編輯:

好吧,我明白了。authentication-failure-handler-ref="myAuthErrorHandler"之前彈簧處理故障案例並將密鑰放入會話中,密鑰爲SPRING_SECURITY_LAST_EXCEPTION
添加故障處理程序後,即
authentication-failure-handler-ref="myAuthErrorHandler"
您必須處理該錯誤。您可以在會話中設置消息。或者直接致電super.onAuthenticationFailure。你的處理程序沒有做任何事情!

+0

我已經回答了你對這個職位的更新添加豆,但我無法弄清楚什麼我做錯了。也許你告訴我的重定向?我應該如何根據你對你的回答告訴我什麼來正確地重定向它?謝謝。 – Ricardo

+0

@Ricardo F更新回答 – Mani

+0

好的,我應該如何重寫AuthentificationListener.java來處理失敗處理程序上的這類錯誤?解決這個問題後,我想使用這個處理程序來控制登錄嘗試更新嘗試次數。但這是另一回事。謝謝您的幫助! – Ricardo

0
<div style="color: red"> 
    Your login attempt was not successful, try again.<br /> Caused : 
    ${sessionScope["SPRING_SECURITY_LAST_EXCEPTION"].message} 
</div> 

使用此,清除形式的login.jsp

創建屬性文件名作爲

  • mymessages.properties
  • AbstractUserDetailsAuthenticationProvider.badCredentials =無效用戶名或密碼

並保存並放置到您的項目分類SPATH

,並在彈簧contex.xml

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>mymessages</value> 
     </list> 
    </property> 
</bean>