java - 微服务 - 如何使用授权服务器和资源服务器对注册流程进行建模?
问题描述
我正在使用 Java 和 Spring Boot 来实现微服务生态系统。
我有 3 个逻辑边界:
- 药品(资源服务器)
- 约会(资源服务器)
- 身份联合(授权服务器)
用户的登录信息(用户名、密码、角色等)进入Identity Federation
微服务。用户的个人信息(名字、姓氏、地址、联系方式、性别等)进入Appointments
微服务。
现在,想象一下Appointments Resource Server
我暴露了以下资源的情况:
GET /doctors/{id}
- 使用传递的 id 返回有关医生的个人信息
在我的Identity Federation Authorization Server
我有以下内容:
POST /oauth/token
- 返回令牌的资源。
现在,假设我POST
在/oauth/token
我的授权服务器上通过了身份验证并收到了一个令牌。
好的,现在,我可以使用此令牌与资源服务器进行交易。
如果我发送一个GET
to /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 需要在某个地方生成。我不确定哪个是最好的方法。
我们团队讨论的内容:
基本上:
POST
具有整个 Doctor JSON 有效负载(带有个人信息和登录信息)的授权服务器的前端。- 授权服务器创建一个生成其唯一 ID 的帐户。
- 授权服务器使用生成的 id 增加 JSON 有效负载,然后将 JSON 发布到队列。
- Resource Server 监听 Queue,获取 JSON 并在他身边创建 Doctor,存储 Doctor 个人信息。
这是一个不好的方法吗?
解决方案
在这种特定情况下,您不需要为了验证特定医生的特殊权限(此处为读取其他医生数据)而实现具有额外复杂性的队列。相反,您可以生成 JWT 令牌并在 toke 的有效负载上嵌入特定权限,例如“READ_DOCTORS_INFO”。然后管理医生信息的资源服务器可以验证提供的令牌并根据嵌入在 JWT 令牌中的权限允许特定用户。
推荐阅读
- angular - 出现错误在尝试填充对象列表时找不到类型为“对象”的不同支持对象“[对象对象]”
- express - 允许现有 API 与 Pusher 桥接,并允许在传输之前对有效负载进行预处理
- android - 缩放与宽度相关的图像
- .net - 我对 .NET Core 中的 web.config 感到困惑
- icinga2 - Icinga2 是否与服务器和客户端之间的路由器一起使用
- cmd - 使用 psexec 时访问被拒绝
- javascript - 掷5个骰子的方法
- sql - 当我们向 EMR 或 Zepplin (AWS-EMR) 添加步骤时,Pyspark 中的完全外连接查询没有输出,并且来自 Pyspark shell 结果很好
- jsf - primefaces 行扩展未更新
- python - Pytest如何模拟threading.Timer