2015-07-20 83 views
0

我使用Spring Security的3.2.6.RELEASE工作,我已經實現了自己的自定義身份驗證提供者,以處理各種失敗的登錄。我需要在用戶名中啓用特殊字符。不過,我不能把這個工作。春季安全使用自定義身份驗證提供不包含特殊字符的用戶名

這裏是我的登錄表單:

<form method="POST" action="<c:url value='j_spring_security_check'/>" accept-charset="utf-8" enctype="application/x-www-form-urlencoded"> 
    <!-- Table --> 
    <table class="table"> 
     <tr> 
      <td><msg:message code="label.username"/></td> 
      <td><input type="text" name="username" /></td> 
     </tr> 
     <tr> 
      <td><msg:message code="label.password"/></td> 
      <td><input type="password" name="password" /></td> 
     </tr> 
     <tr> 
      <td></td> 
      <td><input type="submit" value="Login" /></td> 

     </tr> 
    </table> 
</form> 

我還包含了org.springframework.web.filter.CharacterEncodingFilter在我的web.xml是這樣的:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
    <param-name>forceEncoding</param-name> 
    <param-value>true</param-value> 
</init-param> 
</filter> 

<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

它的權利之前彈簧安全過濾器:

<!-- spring security --> 
<filter> 
<filter-name>springSecurityFilterChain</filter-name> 
<filter-class> 
    org.springframework.web.filter.DelegatingFilterProxy 
</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>ERROR</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
</filter-mapping> 

那麼我在這裏錯過了什麼?登錄頁面是UTF-8編碼,當我檢查FF開發工具/ Firebug時,用戶名參數被正確發送 - user。在我的CustomAuthenticationProvider中調試:

@Override 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 

    UsernamePasswordAuthenticationToken token = null; 
    UsernamePasswordAuthenticationToken auth = (UsernamePasswordAuthenticationToken) authentication; 

    // credentials given by the user 
    String username = (String)auth.getPrincipal(); 
    String password = (String)auth.getCredentials(); 

我看到用戶名是「userä」,登錄失敗。

謝謝大家的幫助! 人

+1

如果有幫助,「A」解碼「澶」表示ISO 8859-1編碼被使用的地方,因爲這就是「A」的UTF-8表示 - 'C3 A4' - 解碼到這個charset。 –

+1

看看[這個問題](http://stackoverflow.com/questions/16302065/spring-security-and-special-characters)。如果你在一個servlet容器中運行你的Spring應用程序,那可能是罪魁禍首。 –

+0

@MelvinKicchi感謝您的評論。我在ISO 8859-1的代碼中無處不在,什麼都沒發現。也許它是在春季安全深處。我會繼續尋找一些隱藏的編碼設置。連接器中的Tomcat配置已被設置爲UTF-8。 –

回答

2
<servlet-name>/*</servlet-name> 

應該

<url-pattern>/*</url-pattern> 

現在,它的工作原理。

相關問題