2016-03-29 105 views
0

我在包含MD5(用戶名+密碼)的數據庫中有一個密碼字段。我將如何在Spring Security + JdbcAuthentication中實現這一點。我知道這是不安全的,但它是一個遺留數據庫,我必須與之交談。我目前的代碼是這樣的:Spring Boot Security 4自定義PasswordEncoder

auth.jdbcAuthentication() 
    .dataSource(dataSource) 
    .usersByUsernameQuery("select login, password, 1 as enabled from 
          login where login=?") 
    .authoritiesByUsernameQuery("select login,role" + 
        " from login lo" + 
        " join login_role lor on lo.login_id = lor.login_id" + 
        " join role gr on lor.role_id = gr.role_id" + 
        " where login=?") 

如果我發送哈希值作爲密碼驗證工程。我想我將不得不配置一些密碼編碼器。

+0

要爲Spring安全性使用盡可能多的默認基礎結構,您需要一個'SaltSource'來獲取用戶名以追加密碼。接下來你需要一個自定義的'MessageDigestPasswordEncoded'擴展來在密碼前添加salt(默認是'password {salt}'而不是你的方案。 –

+0

我已經使用了hacky的方式並且重寫了請求參數ServletFilter。因此,用戶名+密碼作爲密碼傳遞給md5編碼器。有一些大小寫問題,但是SQL解決了這個問題。謝謝大家。 –

回答

-1

你應該做像以下

@Autowired 
public void configAuthentication(AuthenticationManagerBuilder auth) 
    throws Exception { 

    auth.jdbcAuthentication().dataSource(dataSource) 
     .passwordEncoder(passwordEncoder()) 
     .usersByUsernameQuery("sql...") 
     .authoritiesByUsernameQuery("sql..."); 
} 

@Bean 
public PasswordEncoder passwordEncoder(){ 
    PasswordEncoder encoder = new BCryptPasswordEncoder(); 
    return encoder; 
} 

希望它的幫助你。

0

您可以配置整個認證集成到你applicationContext.xlm這樣的:

<sec:authentication-manager> 
     <sec:authentication-provider> 
      <sec:password-encoder ref="encoder" /> // And here is an encoder that will encode a password which comes from login form. 
      <sec:jdbc-user-service data-source-ref="dataSource" 
       users-by-username-query="your query" 
       authorities-by-username-query="your query for authentication table" /> 
     </sec:authentication-provider> 
    </sec:authentication-manager> 

我今天在學校嘗試過了,它爲我工作。我發現解決我的權威問題最簡單的方法,並希望它也能成爲您的合適解決方案。

PS。對不起,我不知道我的答案將如何正確顯示。在這裏只有大約一年的讀者,現在決定自己加入並寫下一些問題

0

我已經用哈克的方式,並重寫了ServletFilter中的請求參數。關鍵是使用自定義的HttpServletRequestWrapper來修改請求。

現在,用戶名+密碼作爲密碼傳遞給md5編碼器。有一些大小寫問題,但調整SQL解決了這個問題。

相關問題