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后面是adminToken,太長這里不貼出來了。

(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" : "larry@pkslow.com",
    "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


歡迎關注微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


免責聲明!

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



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