如何在多个微服务中管理安全上下文

时间:2019-07-12 17:18:16

标签: java hibernate spring-security oauth-2.0 microservices

我正在开发一个依靠多个微服务来提供分析的系统。我有一个使用OAuth2(资源所有者密码凭据)管理授权的微服务。我的目标是审核谁在嵌入式列中创建/更新了某个实体的人,如下所示:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Embeddable
public class AuditEmbeddable implements Serializable {

    @CreatedBy
    @Builder.Default
    @Column(name = "created_by", nullable = false, length = 64, updatable = false)
    private String createdBy = "system";

    @CreatedDate
    @Builder.Default
    @Column(name = "created_at", nullable = false)
    private Instant createdAt = Instant.now();

    @LastModifiedBy
    @Column(name = "modified_by", length = 64)
    private String modifiedBy;

    @LastModifiedDate
    @Column(name = "modified_at")
    private Instant modifiedAt;
}

我确定令牌始终与请求一起发送,因为我们使用了对每个请求进行身份验证的大使网关。目前,我使用的是非常古怪和错误的方法(我认为)。我使用@RequestHeader("Authentication")获取附加到请求的令牌,将请求发送到身份验证服务器以获取用户电子邮件(和角色),并作为参数传递给服务,服务依次设置created_by或{{ 1}}列。有没有一种方法可以拦截并具有某种上下文,我可以自动从中获取用户信息(使用Spring的身份验证服务)?

1 个答案:

答案 0 :(得分:1)

您的主要问题似乎是身份和声明在微服务之间的传播,当然还有如何以最佳方式进行设计。现在,您似乎正在使用OAuth2 / OpenID。如果您使用JWT作为令牌,那么它是一个标准的自包含令牌,其中包含用户身份和声明.Spring安全中有标准类(ResourceServerConfigurerAdapter,TokenStore等),可以在每个微服务中配置这些JWT令牌可以在其中进行配置通过所有微服务上的通用逻辑提取。如果您的令牌不是JWT,则需要编写自定义逻辑以提取用户信息并将其进一步传递。可以在herehere中看到一些很好的设计参考。