9

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

 3 years ago
source link: https://www.pkslow.com/archives/spring-cloud-dataflow-uaa-api
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 已经自动生成了许多相关的表了。

RNBZRfz.png!mobile

这些表还是非常有用的,你可以看到一些默认的配置及关联性。表结构和数据是了解逻辑的一个重要入口。

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" : "[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 来试试:

mqueYrM.png!mobile

可以看到,用户 larry 成功登陆,并且只有只读权限,没有添加、修改等操作功能了。这是因为我们只添加了一个群组 dataflow.view ,认证通过!

5 总结

知道了基本操作后,其它操作也就容易了。更多API接口请查看官网地址: https://docs.cloudfoundry.org/api/uaa/version/74.30.0/index.html

代码请查看: https://github.com/LarryDpk/pkslow-samples

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

Y7z2U3.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK