首页 > 解决方案 > 微服务 - 如何使用授权服务器和资源服务器对注册流程进行建模?

问题描述

我正在使用 Java 和 Spring Boot 来实现微服务生态系统。

我有 3 个逻辑边界:

用户的登录信息(用户名、密码、角色等)进入Identity Federation微服务。用户的个人信息(名字、姓氏、地址、联系方式、性别等)进入Appointments微服务。

现在,想象一下Appointments Resource Server我暴露了以下资源的情况:

在我的Identity Federation Authorization Server我有以下内容:

现在,假设我POST/oauth/token我的授权服务器上通过了身份验证并收到了一个令牌。

好的,现在,我可以使用此令牌与资源服务器进行交易。

如果我发送一个GETto /doctor/1,我的令牌会被解析,我可以阅读它的所有声明。角色、用户 ID、用户名等。

id = 1 的医生应该无法看到其他医生的个人信息(例如:id = 4 的医生)。

因此,当请求到达时/doctors/1,我需要检查令牌上的 id 是否与所请求的相同。

在春天,会是这样的:

@GetMapping("/doctors/{id}")
@PreAuthorize("#id == authentication.doctorId")
public ResponseEntity<Object> handleGetDoctorsInformations(@PathVariable("id") Long id) {
    // logic and return
}

但要做到这一点,我需要在两个微服务(约会资源服务器和身份联合授权服务器)上同步 id。

我不能使用自然键,因为我有三种类型的用户(医生只是其中之一)可以登录,而且两者的自然键不同。

因此,id 需要在某个地方生成。我不确定哪个是最好的方法。

我们团队讨论的内容:

流动

基本上:

  1. POST具有整个 Doctor JSON 有效负载(带有个人信息和登录信息)的授权服务器的前端。
  2. 授权服务器创建一个生成其唯一 ID 的帐户。
  3. 授权服务器使用生成的 id 增加 JSON 有效负载,然后将 JSON 发布到队列。
  4. Resource Server 监听 Queue,获取 JSON 并在他身边创建 Doctor,存储 Doctor 个人信息。

这是一个不好的方法吗?

标签: javaspringspring-bootarchitecturemicroservices

解决方案


在这种特定情况下,您不需要为了验证特定医生的特殊权限(此处为读取其他医生数据)而实现具有额外复杂性的队列。相反,您可以生成 JWT 令牌并在 toke 的有效负载上嵌入特定权限,例如“READ_DOCTORS_INFO”。然后管理医生信息的资源服务器可以验证提供的令牌并根据嵌入在 JWT 令牌中的权限允许特定用户。


推荐阅读