以下全文 Spring Authorization Server 簡稱為: SAS
背景
- Spring 團隊正式宣佈 Spring Security OAuth 停止維護,該專案將不會再進行任何的迭代
- 目前 Spring 生態中的 OAuth2 授權伺服器是 Spring Authorization Server 已經可以正式生產使用
- 作為 SpringBoot 3.0 的過渡版本 SpringBoot 2.7.0 過期了大量關於 SpringSecurity 的配置類,如沿用舊版本過期配置無法向上升級。
遷移過程
本文以PIG 微服務開發平臺為演示,適用於 Spring Security OAuth 2.3 <-> 2.5 的認證中心遷移
① Java 1.8 支援
目前最新的 SAS 0.3 基於 Java 11 構建,低版本 Java 無法使用
經過和 Spring Security 官方團隊的溝通 0.3.1 將繼續相容 Java 1.8
我們聯合 springboot 中文社群編譯了適配 java 1.8 的版本座標如下
<dependency>
<groupId>io.springboot.security</groupId>
<artifactId>spring-security-oauth2-authorization-server</artifactId>
<version>0.3.0</version>
</dependency>
② 授權模式擴充套件
- 擴充套件支援密碼模式,SAS 基於 oauth 2.1 協議不支援密碼模式
- 擴充套件支援簡訊登入
③ Redis 令牌儲存
- 官方目前沒有提供基於 Redis 令牌持久化方案
- PIG 擴充套件 PigRedisOAuth2AuthorizationService 支援
④ Token 輸出格式化
- 使用自省令牌的情況下 預設實現為
ku4R4n7YD1f584KXj4k_3GP9o-HbdY-PDIIh-twPVJTmvHa5mLIoifaNhbBvFNBbse6_wAMcRoOWuVs9qeBWpxQ5zIFrF1A4g1Q7LhVAfH1vo9Uc7WL3SP3u82j0XU5x
- 為方便結合 redis 高效檢索 token ,結合 RDM 分組也可以更方便的圖形化觀察
統一字首::令牌型別::客戶端ID::使用者名稱::uuid
@Bean
public OAuth2TokenGenerator oAuth2TokenGenerator() {
CustomeOAuth2AccessTokenGenerator accessTokenGenerator = new CustomeOAuth2AccessTokenGenerator();
// 注入Token 增加關聯使用者資訊
accessTokenGenerator.setAccessTokenCustomizer(new CustomeOAuth2TokenCustomizer());
return new DelegatingOAuth2TokenGenerator(accessTokenGenerator, new OAuth2RefreshTokenGenerator());
}
⑤ Token 輸出增強
- 使用自省令牌,預設情況下輸出的 Token 格式
{
"access_token": "xx",
"refresh_token": "xx",
"scope": "server",
"token_type": "Bearer",
"expires_in": 43199
}
- Token 增強輸出關聯使用者資訊
{
"sub": "admin",
"clientId": "test",
"access_token": "xx",
"refresh_token": "xx",
"license": "https://pig4cloud.com",
"user_info": {
"username": "admin",
"accountNonExpired": true,
"accountNonLocked": true,
"credentialsNonExpired": true,
"enabled": true,
"id": 1,
"deptId": 1,
"phone": "17034642999",
"name": "admin",
"attributes": {}
}
}
⑥ 授權碼模式個性化
⑦ 資源伺服器
- 自省方案擴充套件支援資源資源伺服器本地查詢
- 擴充套件資源伺服器本地自省
- 優勢: 1. 使用者狀態實時更新 2. 減少網路呼叫提升效能