关于java:Spring-Cloud-Data-Flow整合Cloudfoundry-UAA服务做权限控制

67次阅读

共计 7339 个字符,预计需要花费 19 分钟才能阅读完成。

我最新最全的文章都在 南瓜慢说 www.pkslow.com,欢送大家来喝茶!

1 前言

对于 Spring Cloud Data Flow 这里不多介绍,有趣味能够看上面的文章。本文次要介绍如何整合 Data FlowCloudFoundry UAA来做权限管制,而不是任何人都能够间接拜访操作。

Spring Cloud Data Flow相干文章:

Spring Cloud Data Flow 初体验,以 Local 模式运行

把 Spring Cloud Data Flow 部署在 Kubernetes 上,再跑个工作试试

Spring Cloud Data Flow 用 Shell 来操作,不便建设 CICD

被 Spring 坑了一把,查看源码终于解决了 DataFlow 部署 K8s 利用的问题

UAA,即 CloudFoundry User Account and Authentication,一个身份认证和受权服务零碎,次要用于CloudFoundry,也能够作为一个独立的OAuth2 服务器,给客户端散发令牌。能够在单点登陆 SSO 等场景应用到它。

UAA还能够整合LDAP,但为了简化,本文只演示如何最简略的整合。

2 启动 UAA 服务

官网提供了 war 包模式的 uaa.war,能够间接下载而后部署在Servlet 容器上,如 Tomcat 等。UAA Bundled通过 Springbootwar包包装起来,让启动利用像利用 springboot 一样简略。本文通过这种模式来启动。

通过插件 maven-dependency-plugin 来下载 war 包,如下:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>copy</id>
      <phase>process-resources</phase>
      <goals>
        <goal>copy</goal>
      </goals>
    </execution>
  </executions>
  <configuration>
    <artifactItems>
      <!-- 本地 IDE 启动时须要 -->
      <artifactItem>
        <groupId>org.cloudfoundry.identity</groupId>
        <artifactId>cloudfoundry-identity-uaa</artifactId>
        <version>4.30.0</version>
        <type>war</type>
        <overWrite>true</overWrite>
        <outputDirectory>${project.basedir}/src/main/resources</outputDirectory>
        <destFileName>uaa.war</destFileName>
      </artifactItem>
      <!-- 打包成 jar 须要 -->
      <artifactItem>
        <groupId>org.cloudfoundry.identity</groupId>
        <artifactId>cloudfoundry-identity-uaa</artifactId>
        <version>4.30.0</version>
        <type>war</type>
        <overWrite>true</overWrite>
        <outputDirectory>${project.basedir}/target/classes</outputDirectory>
        <destFileName>uaa.war</destFileName>
      </artifactItem>
    </artifactItems>
  </configuration>
</plugin>

通过一个 Springboot 的主函数入口来调用:

@SpringBootApplication
public class UaaServer {public static void main(String[] args) {SpringApplication.run(UaaServer.class, args);
    }

    @Bean
    public ServletWebServerFactory servletContainer() throws IOException {final File tempDirectory = Files.createTempDirectory("uaa").toFile();
        final File tempUaaYmlFile = new File(tempDirectory, "uaa.yml");
        final File tempUaaWarFile = new File(tempDirectory, "uaa.war");

        FileCopyUtils.copy(new ClassPathResource("uaa.yml").getInputStream(),
                new FileOutputStream(tempUaaYmlFile));

        FileCopyUtils.copy(new ClassPathResource("uaa.war").getInputStream(),
                new FileOutputStream(tempUaaWarFile));

        System.out.println("uaa.yml:" + tempUaaYmlFile.getAbsolutePath());
        System.out.println("uaa.war:" + tempUaaWarFile.getAbsolutePath());

        System.setProperty("UAA_CONFIG_FILE", tempUaaYmlFile.getAbsolutePath());

        return new TomcatServletWebServerFactory() {protected TomcatWebServer getTomcatWebServer(org.apache.catalina.startup.Tomcat tomcat) {final Server tomcatServer = tomcat.getServer();
                final File catalinaBase = new File(tempDirectory, "catalina");
                catalinaBase.mkdirs();

                tomcatServer.setCatalinaBase(catalinaBase);
                new File(tomcatServer.getCatalinaBase(), "webapps").mkdirs();
                try {Context context = tomcat.addWebapp("/uaa", tempUaaWarFile.toString());
                    final ClassLoader properClassLoader = UaaServer.class.getClassLoader();

                    WebappLoader loader =
                            new WebappLoader(properClassLoader);
                    context.setLoader(loader);

                } catch (Exception ex) {throw new IllegalStateException("Failed to add webapp", ex);
                }
                return super.getTomcatWebServer(tomcat);
            }
        };
    }
}

配置文件和 war 包的文件名硬编码了,理论我的项目能够通过配置来实现。

接着要配置 uaa.yml 文件,具体内容查看代码 https://github.com/LarryDpk/p…,这里不贴出来了。留神须要生成 JWT 的 key:

$ openssl genrsa -out signingkey.pem 2048
Generating RSA private key, 2048 bit long modulus
........................+++
..........................................................................+++
e is 65537 (0x10001)

$ openssl rsa -in signingkey.pem -pubout -out verificationkey.pem
writing RSA key

实现以上步骤后,能够打包启动了,命令如下:

mvn clean package
java -jar target/cloudfoundry-uaa-server-1.0-SNAPSHOT.jar

默认端口为8080。胜利启动后,能够拜访:http://localhost:8080/uaa/login

3 配置账号

为了不便,咱们应用内存数据库来保留账户信息,重启后就会失落。通过 uaa 提供的命令行工具 uaac 来创立用户与权限。因为 uaac 是基于 Ruby 的,所以还要先装置Ruby,我的电脑曾经自带,这里就不演示了。

为了更快装置命令行工具 cf-uaac,批改Ruby 包管理工具 gem 的源:

$ gem sources --add https://gems.ruby-china.com
https://gems.ruby-china.com added to sources

$ gem sources -l
*** CURRENT SOURCES ***
https://rubygems.org/
https://gems.ruby-china.com

$ gem sources --remove https://rubygems.org/
https://rubygems.org/ removed from sources

配置了国内源后,装置:

$ sudo gem install cf-uaac
15 gems installed

装置实现后,就能够通过上面的命令来创立用户了。

uaac target http://localhost:8080/uaa
uaac token client get admin -s adminsecret
uaac client add dataflow \
  --name dataflow \
  --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 \
  --authorized_grant_types password,authorization_code,client_credentials,refresh_token \
  --authorities uaa.resource,dataflow.create,dataflow.deploy,dataflow.destroy,dataflow.manage,dataflow.modify,dataflow.schedule,dataflow.view,sample.view,sample.create \
  --redirect_uri http://localhost:9393/login \
  --autoapprove openid

uaac group add "sample.view"
uaac group add "sample.create"
uaac group add "dataflow.view"
uaac group add "dataflow.create"
uaac group add "dataflow.deploy"
uaac group add "dataflow.destroy"
uaac group add "dataflow.manage"
uaac group add "dataflow.modify"
uaac group add "dataflow.schedule"


uaac user add larry -p larry --emails larry@pkslow.com
uaac member add "dataflow.view" larry
uaac member add "dataflow.create" larry
uaac member add "dataflow.deploy" larry
uaac member add "dataflow.destroy" larry
uaac member add "dataflow.manage" larry
uaac member add "dataflow.modify" larry
uaac member add "dataflow.schedule" larry

uaac user add vieweronly -p mysecret --emails vieweronly@pkslow.com
uaac member add "dataflow.view" vieweronly

这里要害的是用户和群组,即 usergroup。这里配置的信息,会与 Data Flow Server 的配置对应上才能够。

4 配置与启动 Data Flow Server

Data Flow Server的配置文件十分重要,它是整合 UAA 的要害。要害是两局部,第一局部是配置 UAA 各种信息,如 clientIdToken 的地址,各种鉴权地址等;第二局部是角色映射,Data Flow是基于角色的权限管制,它本人的角色要和 UAA 的群组映射起来才能够失常应用。

配置如下:

spring:
  security:
    oauth2:
      client:
        registration:
          uaa:
            client-id: dataflow
            client-secret: dataflow
            redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
            authorization-grant-type: authorization_code
            scope:
              - openid
              - dataflow.create
              - dataflow.deploy
              - dataflow.destroy
              - dataflow.manage
              - dataflow.modify
              - dataflow.schedule
              - dataflow.view
        provider:
          uaa:
            jwk-set-uri: http://localhost:8080/uaa/token_keys
            token-uri: http://localhost:8080/uaa/oauth/token
            user-info-uri: http://localhost:8080/uaa/userinfo
            user-name-attribute: user_name
            authorization-uri: http://localhost:8080/uaa/oauth/authorize
      resourceserver:
        opaquetoken:
          introspection-uri: http://localhost:8080/uaa/introspect
          client-id: dataflow
          client-secret: dataflow
  cloud:
    dataflow:
      security:
        authorization:
          provider-role-mappings:
            uaa:
              map-oauth-scopes: true
              role-mappings:
                ROLE_VIEW: dataflow.view
                ROLE_CREATE: dataflow.create
                ROLE_MANAGE: dataflow.manage
                ROLE_DEPLOY: dataflow.create
                ROLE_DESTROY: dataflow.create
                ROLE_MODIFY: dataflow.create
                ROLE_SCHEDULE: dataflow.create

能够看出,多个不同角色能够映射同一个群组,非常灵活。

配置实现后,就能够启动 Data Flow Server 了:

java -jar data-flow-server.jar --spring.config.additional-location=./src/main/resources/application.yaml

5 体验成绩的时候到了

胜利启动 UAA 并配置用户,再启动 Data Flow Server 后,便能够开始应用了,过程如下:

拜访 http://localhost:9393/dashboard/#/apps 会主动跳转到登陆界面,点击uaa

跳转到 uaa 的登陆界面:

输出配置的账号密码:larry/larry,下面显示为Email,其实并不是。登陆后就要确认受权:

受权后,会主动跳转回 Data Flow 的界面,并曾经有权限进行查看操作了:

登出后,又要要求从新登陆。至此,咱们曾经胜利地整合了。

shell 的应用如下:

$ java -jar spring-cloud-dataflow-shell-2.7.0.jar \
  --dataflow.uri=http://localhost:9393            \   
  --dataflow.username=my_username                 \   
  --dataflow.password=my_password                 \   
  --skip-ssl-validation  true    

总结

本文通过一步步演示如何整合 Data Flow ServerUAA,以实现 Data Flow 平安要求。理论 UAA 应该应用其它数据库,如MySQL,或整合LDAP,这样重启账号数据不会失落。后续有空再探讨吧。

代码请查看:https://github.com/LarryDpk/p…


参考文档:

Data Flow 官网文档 2.7.0 版本

A Quick Guide To Using Cloud Foundry UAA


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

多读书,多分享;多写作,多整顿。

正文完
 0