2

我有一個使用Spring Security進行身份驗證的Spring項目。春季安全自定義哈希算法

Spring Security的代碼片段:

<authentication-manager> 
     <authentication-provider> 
     <password-encoder hash="md5"/> 
       <jdbc-user-service data-source-ref="dataSource" 

       users-by-username-query=" 
SELECT users.LOGIN_NAME AS username, 
    users.PASSWD_HASH  AS password , users.status as enabled 
    FROM RV_USER users 
    WHERE users.LOGIN_NAME=?" 
       authorities-by-username-query=" 
         select users.LOGIN_NAME as username, authorities.ROLE_DESC as authority 
from RV_ROLE authorities, RV_USER users 
where authorities.ROLE_ID=users.ROLE_ID 
and users.LOGIN_NAME=?" 

      /> 
     </authentication-provider> 
    </authentication-manager> 

我想用一個自定義的哈希算法,而不是MD5或別的東西。

回答

6

您可以創建自己的PasswordEncoder實現。例如:

import org.springframework.security.crypto.password.PasswordEncoder; 

public class CustomPasswordEncoder implements PasswordEncoder { 

    public String encode(CharSequence rawPassword) { 
     return null; // TODO implement 
    } 

    public boolean matches(CharSequence rawPassword, String encodedPassword) { 
     return null; // TODO implement 
    } 
} 

然後可以使用CustomPasswordEncoder與[email protected]例如:

<authentication-manager> 
    <authentication-provider> 
    <password-encoder ref="customPasswordEncoder/> 
    ... 
    </authentication-provider> 
</authentication-manager> 
+0

感謝。但是當我使用j_spring_security_check進行身份驗證時,它正在碰到isPasswordValid()方法。我應該在哪裏編碼密碼。請詳細分享代碼。 –

+0

另外我如何獲取用戶名,以便我可以根據用戶名驗證密碼? –

+0

如果您仍在使用isPasswordValid方法,則使用舊的PasswordEncoder接口,而不是上面提供的代碼。密碼編碼僅用於密碼編碼。它不需要知道如何根據用戶名驗證密碼。 Spring Security將採用用戶提供的用戶名和密碼,它將使用UserDetailsS​​ervice查找當前用戶,然後它將傳入rawPassword(即用戶輸入的那個)和從UserDetailsS​​ervice返回到匹配方法的密碼。 –