2012-11-07 68 views
2

我正在使用Spring安全性對用戶進行身份驗證。我創建了一個自定義身份驗證提供程序,現在我想知道如何從提供程序中將錯誤消息導入到我的表單中。這是我的自定義身份驗證提供者的身份驗證()方法:在Spring登錄中顯示錯誤消息

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
    UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString()); 

    if(profile == null){ 
     throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal())); 
    } 

    String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString()); 

    if(!profile.getPasswordHash().equals(suppliedPasswordHash)){ 
     throw new BadCredentialsException("Invalid credentials"); 
    } 

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities()); 

    return token; 
} 

這是我的形式:

<form name='f' action="<c:url value='j_spring_security_check' />" method='POST'> 
<div id="data-entry-form"> 

    <div class="form-entry"> 
     <label><spring:message code="login.form.label.email"/></label> 
     <input type='text' name='j_username' value=''> 
    </div> 
    <div class="form-entry"> 
     <label><spring:message code="login.form.label.password"/></label> 
     <input type='password' name='j_password'/> 
    </div> 
    <div class="form-entry"> 
     <input type="submit" value="Verzenden"/> 
    </div> 
</div> 

我怎麼會得到錯誤信息到我的形式?從我按下登錄按鈕的那一刻起,Spring就接管了,所以唯一可以生成錯誤消息的方法是authenticate()方法...

回答

3

我認爲您應該能夠在與使用「標準」認證器相同的方式。 如果在認證過程中引發異常(或多個異常),則最後一個異常存儲在會話屬性SPRING_SECURITY_LAST_EXCEPTION中。

所以,從JSP獲得最後的異常信息,您可以使用這樣的事情:

<%=((Exception) request.getSession().getAttribute("SPRING_SECURITY_LAST_EXCEPTION")).getMessage()%>; 

當然,如果你有一個控制器,你或許應該從控制器得到消息,只有通過字符串到jsp。這只是一個例子)

+0

即使在我爲每個取消引用的變量添加檢查之後,我在JSP中使用此解決方案時有很多'NullPointerException'。所以我找到了一個更好的解決方案,並將其作爲我自己的答案發布。 – vadipp

1

我能解決這個問題是這樣的:

<c:if test="${param.auth eq 'failure'}"> 
    <div class="error"> 
    <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" /> 
    </div> 
</c:if> 

請注意,您需要檢測是否有通過它您可以在彈簧設定一個特殊的參數錯誤像這樣的安全配置:

<security:form-login [...] authentication-failure-url="/login?auth=failure" />