Spring Cloud Data Flow整合UAA使用外接資料庫和API介面
我最新最全的文章都在 南瓜慢說 www.pkslow.com ,歡迎大家來喝茶!
1 前言
之前的文章《Spring Cloud Data Flow整合Cloudfoundry UAA服務做許可權控制》介紹瞭如何用UAA
來保護Spring Cloud Data Flow
,但使用是記憶體資料庫,重啟UAA
後就丟失了配置資訊。而且需要通過Ruby gem
安裝uaac
命令列工具,有點麻煩,比較不是所有人都會使用Ruby
的。
本文將解決這兩個問題,問題一通過引入PostgreSQL
來解決;問題二通過UAA REST API
來解決。
Spring Cloud Data Flow
相關文章:
Spring Cloud Data Flow初體驗,以Local模式執行
把Spring Cloud Data Flow部署在Kubernetes上,再跑個任務試試
Spring Cloud Data Flow用Shell來操作,方便建立CICD
被Spring坑了一把,檢視原始碼終於解決了DataFlow部署K8s應用的問題
2 連線PostgreSQL資料庫
為方便,我們通過Docker
來啟動PostgreSQL
,可以參考《Docker啟動PostgreSQL並推薦幾款連線工具》,命令如下:
docker run -itd \ --name pkslow-postgres \ -e POSTGRES_DB=pkslow \ -e POSTGRES_USER=pkslow \ -e POSTGRES_PASSWORD=pkslow \ -e PGDATA=/var/lib/postgresql/data/pgdata \ -p 5432:5432 \ postgres:10
配置uaa.yml
連線資料庫如下:
spring_profiles: default,postgresql database: driverClassName: org.postgresql.Driver url: jdbc:postgresql://localhost:5432/pkslow username: pkslow password: pkslow maxactive: 15 maxidle: 10 minidle: 3 removeabandoned: false logabandoned: true abandonedtimeout: 300 evictionintervalms: 15000 caseinsensitive: false
配置完成啟動UAA
,就可以看到PostgreSQL
已經自動生成了許多相關的表了。
這些表還是非常有用的,你可以看到一些預設的配置及關聯性。表結構和資料是瞭解邏輯的一個重要入口。
3 通過UAA API配置
之前我們是通過uaac
命令來建立客戶端、群組和使用者等,這次我們不再依賴uaac
,而是通過訪問Api
來操作。要使用之前,我們需要新增Json
依賴,否則會報錯。如下:
<!--json-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.9</version>
</dependency>
(1)獲取admin的Token
我們要進行操作,首先要有admin
管理員的賬號,預設使用者名稱和密碼是admin:adminsecret
,獲取它的Token
命令如下:
curl -v -d "username=admin&password=adminsecret&client_id=admin&grant_type=client_credentials" -u "admin:adminsecret" http://localhost:8080/uaa/oauth/token
UAA
伺服器則會返回一個很長的Token
,我們需要把它記錄下來,後續都要使用到它。
(2)建立客戶端
一個客戶端對應一個應用的鑑權,這裡建立一個名叫dataflow
的客戶端,命令如下:
curl 'http://localhost:8080/uaa/oauth/clients' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzI1Nxxxxxx' \
-H 'Accept: application/json' \
-d '{
"name" : "dataflow",
"client_id" : "dataflow",
"client_secret" : "dataflow",
"scope" : ["cloud_controller.read", "cloud_controller.write", "openid", "password.write", "scim.userids", "sample.create", "sample.view", "dataflow.create", "dataflow.deploy", "dataflow.destroy", "dataflow.manage", "dataflow.modify", "dataflow.schedule", "dataflow.view"],
"resource_ids" : [ ],
"authorized_grant_types" : [ "password", "authorization_code", "client_credentials", "refresh_token" ],
"redirect_uri" : [ "http://localhost:9393/login" ],
"authorities" : ["uaa.resource", "dataflow.create", "dataflow.deploy", "dataflow.destroy", "dataflow.manage", "dataflow.modify", "dataflow.schedule", "dataflow.view", "sample.view", "sample.create"],
"token_salt" : "m6c6fB",
"autoapprove" : "openid",
"allowedproviders" : [ "uaa", "ldap", "my-saml-provider" ]
}'
注意:Bearer後面是admin
的Token
,太長這裡不貼出來了。
(3)建立群組
群組對應的是許可權,只有在群組裡的使用者,才有相關許可權。建立群組的同時,還可以新增使用者,指定members
就行,這裡不新增。命令如下:
curl 'http://localhost:8080/uaa/Groups' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzxxx' \
-d '{
"displayName" : "dataflow.view",
"description" : "dataflow.view"
}'
建立成功後會返回群組UUID,需要記錄下來。
(4)建立使用者
這裡說的使用者就是登陸客戶端應用的具體使用者了,這裡建立使用者larry
,密碼為larry
,命令如下:
curl 'http://localhost:8080/uaa/Users' -i -X POST \
-H 'Accept: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSxxx' \
-H 'Content-Type: application/json' \
-d '{
"externalId" : "test-user",
"meta" : {
"version" : 0,
"created" : "2020-12-18T15:55:56.465Z"
},
"userName" : "larry",
"name" : {
"formatted" : "Larry Deng",
"familyName" : "Deng",
"givenName" : "Larry"
},
"emails" : [ {
"value" : "[email protected]",
"primary" : true
} ],
"phoneNumbers" : [ {
"value" : "666666"
} ],
"active" : true,
"verified" : true,
"origin" : "",
"password" : "larry",
"schemas" : [ "urn:scim:schemas:core:1.0" ]
}'
建立成功後會返回使用者UUID,需要記錄下來。
(5)把使用者加到群組裡
當群組和使用者都建立成功後,就把使用者新增到群組中去,這裡是通過UUID來關聯的,命令如下:
curl 'http://localhost:8080/uaa/Groups/d633a216-029b-4f44-a7e0-15c5fd326ef2/members' -i -X POST \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOiJSUzIxxx' \
-d '{"origin":"uaa","type":"USER","value":"a45a62a1-47ad-4345-bcef-ba12d7fd97e4"}'
URL
的是群組UUID,訊息體的是使用者的UUID。
4 登陸認證
配置完成後,可以檢視資料庫來認證。當然最直觀的還是直接登陸Data Flow
來試試:
可以看到,使用者larry
成功登陸,並且只有只讀許可權,沒有新增、修改等操作功能了。這是因為我們只添加了一個群組dataflow.view
,認證通過!
5 總結
知道了基本操作後,其它操作也就容易了。更多API介面請檢視官網地址:https://docs.cloudfoundry.org/api/uaa/version/74.30.0/index.html 。
程式碼請檢視:https://github.com/LarryDpk/pkslow-samples
歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...
多讀書,多分享;多寫作,多整理。