Spring Cloud Data Flow整合UAA使用外置数据库和API接口

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

欢迎关注微信公众号< 南瓜慢说 >,将持续为你更新…

南瓜慢说
我还没有学会写个人说明!
上一篇

博客三周年了。 迟到的2020年年终总结, 挺有意思的一年

你也可能喜欢

评论已经被关闭。

插入图片