1. 简介

在之前的文章中,我们已经介绍了 JHipster 的基础使用 以及如何用它来生成一个 基于微服务架构的应用

本教程将深入探讨 JHipster 的用户账户与认证服务(User Account and Authentication,简称 UAA),并演示如何用它来保护一个完整的 JHipster 微服务应用。更棒的是,这一切 无需编写一行代码 即可实现!

⚠️ 注意:在 JHipster 的最新版本中,UAA 选项已被移除,官方推荐使用 OAuth2 作为认证机制。

2. UAA 的核心特性

在之前构建的应用中,用户账户是应用的一部分。这在单体应用中没有问题,但如果需要在多个 JHipster 应用之间共享用户账户,就需要用到 JHipster 的 UAA。

✅ JHipster 的 UAA 是一个独立的微服务,可独立构建、部署和运行。它的主要功能包括:

  • 作为基于 Spring Boot 实现的 OAuth2 授权服务器
  • 作为身份管理服务器,提供用户账户的 CRUD API

此外,JHipster UAA 还支持常见的登录功能,如用户自助注册和“记住我”功能,并且与 JHipster 生态中的其他服务无缝集成。

3. 开发环境准备

在开始开发前,确保你的开发环境已满足所有前提条件。除了 JHipster 入门 中提到的工具,还需要启动 JHipster Registry。Registry 服务用于让各个微服务之间相互发现和通信。

有关如何生成和运行 Registry 的完整步骤,请参考 JHipster 微服务架构文章第 4.1 节。你也可以使用 Docker 镜像 启动 Registry。

4. 创建一个新的 JHipster UAA 服务

使用 JHipster 命令行工具创建 UAA 服务:

$ mkdir uaa
$ cd uaa
$ jhipster

在第一个问题中,选择 “JHipster UAA (for microservice OAuth2 authentication)”:

app type

接下来是一些配置项,如应用名称、端口号和服务发现:

jhipster uaa setup

大部分默认配置即可,应用名我们使用 “uaa”(小写),这样更合理。其他配置可根据需要调整。

生成完成后,使用 Maven 脚本启动服务:

$ ./mvnw
... build messages omitted
2018-10-14 14:07:17.995  INFO 18052 --- [  restartedMain] com.baeldung.jhipster.uaa.UaaApp         :
----------------------------------------------------------
        Application 'uaa' is running! Access URLs:
        Local:          http://localhost:9999/
        External:       http://192.168.99.1:9999/
        Profile(s):     [dev, swagger]
----------------------------------------------------------
2018-10-14 14:07:18.000  INFO 18052 --- [  restartedMain] com.baeldung.jhipster.uaa.UaaApp         :
----------------------------------------------------------
        Config Server:  Connected to the JHipster Registry config server!
----------------------------------------------------------

✅ 关键信息是 UAA 成功连接到 JHipster Registry,说明它可以被其他服务发现。

5. 测试 UAA 服务

由于 UAA 没有 UI,我们通过 API 来测试其功能。

我们需要验证两个核心功能:OAuth2 令牌生成 和 账户信息获取。

获取访问令牌

$ curl -X POST --data \
 "username=user&password=user&grant_type=password&scope=openid" \
 http://web_app:changeit@localhost:9999/oauth/token

这里使用的是 password grant 流程,使用默认的测试用户 user/user。返回如下:

{
  "access_token" : "eyJh...(token omitted)",
  "token_type" : "bearer",
  "refresh_token" : "eyJ...(token omitted)",
  "expires_in" : 299,
  "scope" : "openid",
  "iat" : 1539650162,
  "jti" : "8066ab12-6e5e-4330-82d5-f51df16cd70f"
}

获取账户信息

使用上面的 access_token 请求账户信息:

$ curl -H "Authorization: Bearer eyJh...(access token omitted)" \ 
 http://localhost:9999/api/account
{
  "id" : 4,
  "login" : "user",
  "firstName" : "User",
  "lastName" : "User",
  "email" : "user@localhost",
  "imageUrl" : "",
  "activated" : true,
  "langKey" : "en",
  "createdBy" : "system",
  "createdDate" : "2018-10-14T17:07:01.336Z",
  "lastModifiedBy" : "system",
  "lastModifiedDate" : null,
  "authorities" : [ "ROLE_USER" ]
}

⚠️ 请在 token 有效期内使用(默认 5 分钟)。可以通过修改 application-<profile>.yml 文件中的 uaa.web-client-configuration.access-token-validity-in-seconds 来调整有效期。

6. 创建基于 UAA 的网关

现在我们创建一个网关,用于与 UAA 协同工作,提供前端界面和 API 路由功能。

$ mkdir gateway
$ cd gateway
$ jhipster

选择以下关键配置项:

  • Application type: Microservices gateway
  • Authentication type: Authentication with JHipster UAA server
  • UI Framework: Angular 6

生成完成后,启动网关:

$ ./mvnw
... many messages omitted
----------------------------------------------------------
        Application 'gateway' is running! Access URLs:
        Local:          http://localhost:8080/
        External:       http://192.168.99.1:8080/
        Profile(s):     [dev, swagger]
----------------------------------------------------------

访问 http://localhost:8080 登录应用,使用默认账户 admin/admin

jhipster home

登录成功后,前端将通过网关与 UAA 交互,获取 token 并保存为 cookie。后续请求中,网关会自动添加 Authorization Header。

7. 创建基于 UAA 的微服务

我们创建一个名为 “quotes” 的微服务,用于管理股票报价。

$ mkdir quotes
$ cd quotes
$ jhipster

关键配置:

  • Service Discovery: JHipster Registry
  • Path to the UAA application: ../uaa
  • Authentication Type: JHipster UAA server

生成完成后启动服务:

$ ./mvnw

7.1 添加 Quote 实体

停止服务后,使用 JDL 文件创建实体:

创建 quotes.jh 文件:

entity Quote {
  symbol String required unique,
  price BigDecimal required,
  lastTrade ZonedDateTime required
}
dto Quote with mapstruct
paginate Quote with pagination
service Quote with serviceImpl
microservice Quote with quotes
filter Quote
clientRootFolder Quote with quotes

导入实体:

$ jhipster import-jdl quotes.jh

7.2 添加前端 UI

在 gateway 项目中导入 JDL 文件:

$ jhipster import-jdl ../jhipster-quotes/quotes.jh

重启网关后,可以看到新的菜单项:

jhipster gateway entities menu

点击进入 Quotes 页面,可进行 CRUD 操作:

jhipster gateway quotes

8. 下一步建议

虽然我们已经构建了一个可用的应用,但在实际项目中,你可能需要:

  • ✅ 自定义前端样式(CSS/图片)
  • ✅ 对接已有用户系统(如 LDAP)
  • ⚠️ 实现实例/字段级别的安全控制(默认不支持)

即使如此,JHipster 仍然能极大提升开发效率,提供良好的代码一致性。

9. 总结

本文展示了如何使用 JHipster 构建一个基于微服务架构和 UAA 认证的应用。全程无需编写任何 Java 代码,非常高效。

完整代码可参考 GitHub 仓库


原始标题:Building a Basic UAA-Secured JHipster Microservice | Baeldung