04.spring security oauth2認證中心 集成zuul網關的代碼分析

Oauth2

oauth2是一個搞授權的,對於Api網關來說,用oauth2來做業務鑑權是比較合適的選擇,其有幾種角色的定義:
資源擁有者(resource owner):能授權訪問受保護資源的一個實體,可以是一個人,那我們稱之爲最終用戶;
資源服務器(resource server):存儲受保護資源,客戶端通過access token請求資源,資源服務器響應受保護資源給客戶端;
授權服務器(authorization server):成功驗證資源擁有者並獲取授權之後,授權服務器頒發授權令牌(Access Token)給客戶端。
客戶端(client):第三方應用,也可以是它自己的官方應用;其本身不存儲資源,而是資源擁有者授權通過後,使用它的授權(授權令牌)訪問受保護資源,然後客戶端把相應的數據展示出來/提交到服務器。

oauth2原理圖
04.spring security oauth2認證中心 集成zuul網關的代碼分析

zuul作爲業務網關需要對其內部的服務進行權限控制,採用oauth2的資源服務器集成到zuul中可以很好的保護zuul內部的服務,需要搭建服務註冊中心,認證中心,鑑權中心三大板塊,其中鑑權中心是和zuul整合在一起充當門面設計,zuul判斷哪些服務需要token哪些不需要。
服務註冊中心:open-eureka-server,此項目爲eureka-server服務器,eureka客戶端通過服務名實現ribbon的負載均衡,具體。
認證中心:open-oauth-server,此項目結合了spring cloud oauth2的認證服務器功能,實現了派發token的作用,同時此認證中心納入到了服務註冊中心,實現高可用。

鑑權中心:open-api-gateway ,此項目爲業務網關同時也是資源服務器,可以接入各種微服務子項目,通過配置AuthorizeConfigProvider實現具體鑑權或放權功能。

解決Principal must not be null的關鍵在於OAuth2AuthenticationManager類種的 tokenServices.loadAuthentication(token),認證中心以及鑑權中心需要同時實現一下接口
public class RedisTemplateTokenStore implements TokenStore {

private static final String ACCESS = "access:";
private static final String AUTH_TO_ACCESS = "auth_to_access:";
private static final String AUTH = "auth:";
private static final String REFRESH_AUTH = "refresh_auth:";
private static final String ACCESS_TO_REFRESH = "access_to_refresh:";
private static final String REFRESH = "refresh:";
private static final String REFRESH_TO_ACCESS = "refresh_to_access:";
private static final String CLIENT_ID_TO_ACCESS = "client_id_to_access:";
private static final String UNAME_TO_ACCESS = "uname_to_access:";

}即可解決Principal must not be null報錯,此方式也是最具效率的方式,Principal must not be null報錯是由於採用的RemoteTokenServices方式校驗token,這種方式需要通過http連接認證中心,認證中心需要從redis種校驗token,採取RedisTemplateTokenStore重寫token方式可以直連redis避免額外的http消耗。

04.spring security oauth2認證中心 集成zuul網關的代碼分析

sso連接zuul
security:
user:
password: 123456
oauth2:
sso:
login-path: /login
client:
client-id: owen
client-secret: owen
user-authorization-uri: http://127.0.0.1:9200/auth/oauth/authorize ##網關地址負載認證中心服務
access-token-uri: http://127.0.0.1:9200/auth/oauth/token ##網關地址負載認證中心服務
resource:
token-info-uri: http://127.0.0.1:9200/auth/oauth/check_token ##網關地址負載認證中心服務
prefer-token-info: true

爲實現以上部分 必須注入RandomValueAuthorizationCodeServices持久化授權碼,oauth2有jdbc相關實現,可以參考JdbcAuthorizationCodeServices改成redis方法 提高性能 。

開源項目:https://gitee.com/owenwangwen/open-capacity-platform
聯繫作者qq:624191343 1758783856

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章