oAuth2 升級Spring Cloud Finchley.RELEASE踩坑分享

冷冷gg發表於2018-06-23

背景

6.19號,spring團隊釋出了期待已久的 Spring Cloud Finchley.RELEASE 版本。 重要變化:

  • 基於Spring Boot 2.0.X
  • 不相容 Spring Boot 1.5.X

期間踩過幾個坑,分享出來給大夥,主要是關於 Spring Cloud oAuth 部分

目標

基於現有Spring Cloud 腳手架pig開始動手升級。

關於pig:

基於Spring Cloud、oAuth2.0開發基於Vue前後分離的開發平臺,支援賬號、簡訊、SSO等多種登入,提供配套視訊開發教程。

碼雲地址:gitee.com/log4j/pig

版本變化

                 +------------------+
                 |                  |
                 |  1.5.12.RELEASE  |
                 |                  |
                 +--------+---------+
                          |
Spring Boot               |
                          v

                 +------------------+
                 |                  |
                 |  2.0.3.RELEASE   |
                 |                  |
                 +------------------+

複製程式碼
                 +------------------+
                 |                  |
                 |  Edgware.SR3     |
                 |                  |
                 +--------+---------+
                          |
Srping Cloud              |
                          v

                 +------------------+
                 |                  |
                 |  Finchley.RELEASE|
                 |                  |
                 +------------------+

複製程式碼

問題總結

PasswordEncoder 變化

直接使用原有程式碼報錯:

passwordencoder mapped for the id null
複製程式碼
// 舊
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}
 
// 新
@Bean
public PasswordEncoder passwordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

複製程式碼

在 Finchley 版本中, 出於安全性的原因,修改了PasswordEncoder 的生成和使用方法。
在注入bean 的時候不能顯示指定PasswordEncoder的實現類,類比舊方法。只能通過工廠類來建立

image

PasswordEncoderFactories.createDelegatingPasswordEncoder();
複製程式碼

image
通過傳入密碼的特徵碼,動態去獲取密碼匹配器,這也就意味著儲存在同一個庫中密碼可以使用多種加密方式。

{bcrypt}$2a$10$p0JC.ofpM8RxVTSubkKLDOUloGrQAX.lx/67HwnnyumATT69mwYm2
複製程式碼

第一部分為加密方式的特徵碼,支援的型別如上圖,第二部分為密文。

image
附上官方文件介紹:https://spring.io/blog/2017/11/01/spring-security-5-0-0-rc1-released#password-storage-updated

RedisTokenStore bug

當授權Auth-Server 配置token 儲存在redis 時,報了下面的錯誤。

NoSuchMethodError.RedisConnection.set([B[B)V #16
複製程式碼

Finchley.RELEASE 依賴的版本為 2.2.X版本。

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.2.X</version>
</dependency>
複製程式碼

升級到 2.3.3版本即可解決Redis操作問題

<!--spring security 、oauth、jwt依賴-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
    <exclusions>
        <!--舊版本 redis操作有問題-->
        <exclusion>
            <artifactId>spring-security-oauth2</artifactId>
            <groupId>org.springframework.security.oauth</groupId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>
複製程式碼

Spring Boot Admin 2.0.1

Spring Boot Admin 監控元件也釋出了 相容Finchley.RELEASE的 2.0.1版本,相較之前版本不同,當前版本需要和***spring security***配合使用 客戶端:

image
image

<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
複製程式碼
/**
 * @author lengleng
 * @date 2018/6/22
 * 針對監控模組。全部放行
 */
@Configuration
public class SecurityPermitAllConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll()
            .and().csrf().disable();
    }
}
複製程式碼

詳細使用我會再分享一篇關於 spring boot admin 2.0.X版本

寫在最後

相關文章