Spring cloud微服務安全實戰-4-7重構代碼以適應真實環境


現在有了認證服務器,也配置了資源服務器。也根據OAuth協議,基於令牌認證的授權也跑通了。基本的概念也有了簡單的理解。
往下深入之前,有幾個點,還需要說一下

使用scopes來控制權限,scopes可以理解為之前的ACL 第三章的時候自己寫的ACL來控制的讀寫權限。在OAuth協議里面用scopes來實現ACL的權限控制,兩方面,首先在服務器這一端,可以針對不同的應用發出去不同權限的令牌, 。

比如針對oderApp可以有讀權限,也可以有寫的權限。


針對orderService發出去的就只有read 讀的權限。這是在服務器端,我可以控制發出去的令牌可以包含配置權限,

另外在資源服務器這一端,我也可以根據令牌里的scopes去控制一些權限。那么下面來看下 在服務器端 怎么去做這個事。
還是演示讀寫權限這樣的場景的控制

讀寫權限演示


orderController 再寫一個getInfo。只是為了讀和寫 這兩個請求。



這個適配器里面還有一個方法,可以用來控制我們的訪問權限。

默認的配置是任何請求都需要身份認證

有write的scope的時候,才能去調用post請求。

get的請求要有read的scope權限

啟動服務測試

首先啟動認證服務

現在只去拿reade的權限

現在拿到的token只有read的權限。

啟動訂單服務。用令牌去創建訂單的方法。

錯誤,爭對這個資源沒有scope。需要的scope是write。但是你的令牌沒有write的權限。

這樣我們就基於OAuth2實現了ACL
我們發送一個get請求 可以成功。

在資源服務器中獲取用戶信息

之前將的是在這里拿到用戶名

能不能在之類直接拿到用戶信息呢?????創建一個UserDetailsService的實現類。

它里面只有一個方法就是根據用戶名返回 UserDetails對象。

創建一個user類。

也要實現UserDetais的接口



把字符串轉換成 GrantedAuthority集合返回。


getPassword和getUserName這里就刪掉

在上面定義 username和password。然后生成get和set屬性。

這兩個方法都返回true

密碼是不是沒過期,也返回true

賬戶是不是可用的 也返回true

加一個自己特有的屬性id並生成get和set方法。這個就是除了UserDetails要求以外,我們自己聲明的信息。


把這個UserDetailsService接口的實現,聲明成一個Spring的Bean。

有了這個Bean 我們需要修改下配置 ,讓它用這個bean來讀取相關的用戶信息。

我們寫一個getAccessTokenConvert這樣的一個方法。


設置用userDetailsService轉換成user對象。

最終返回

測試

啟動認證服務

啟動訂單服務。


因為當前令牌是存在內存里面的。一旦認證服務器重啟了。這些令牌就都消失了 。我們要重新申請令牌。

重新申請令牌



控制台獲取到了用戶的id

下面的這段邏輯就可以根據用戶名去數據庫內去查詢

只要用戶id

這里只要用戶的id 也不需要用戶的對象了。


這樣寫了以后,它就會把User對象里面的id單獨拿出來 傳遞出去。可以用這個表達式把對象里面任何一個屬性 當做參數傳出來。



orderAPi服務 重啟


查看控制台的輸出

數據持久化

一塊是客戶端應用的數據,server里面的這段配置。這塊信息要放到數據庫里。

令牌的信息持久化。生產環境一般是集群,至少是兩台機器。
在SpringSceurityOAuth的測試代碼里面提供了一組構件表的scheme。這個scheme是爭對內存的數據庫來寫的。主要用來測試的。


把代碼復制出來,改一下 爭對MySql 主要改了下數據類型。這個目錄下的 就是可以直接創建表結構的

建好的表

目前可能就用到這兩張表

加上數據庫的依賴,一個是jdbc的啟動器,它會替我去聲明一個數據源,還有jdbcTemplate。
另外一個就是MySql的驅動。


數據庫相關的配置也復制到server的微服務里面



首先是把這些放到數據庫的表內

寫一個main函數,讓把加密后的密碼打印出來 存到我們的數據庫內

這個就是加密后的密碼串。


填寫多個的用逗號隔開



添加另外一條數據。這樣就把客戶端的信息都加如到數據庫表內了。

讀取數據庫內的配置

注入數據源。然后用jdbc。把數據源給它。它會自動根據數據源 到數據庫內讀取auth_client_details表內的數據

把token的信息放進去。

tokenStore是一個接口,作用就是存取token的。把數據源dataSource給它

告訴服務器用這個tokenStore來存取token。

這樣token聚會存到數據庫內。

測試


訪問getToken的請求

這句說明 信息都挪到數據庫里面了 但是也可以正常的拿到這些信息。

生成的令牌也存到了access_token的表內

這樣就有了一個持久化的令牌。
這個時候不管我是集群也好 ,還是認證服務器重啟也好。令牌信息都不會丟失了。

結束

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM