spring-boot - 如何在微服务架构中实现基于角色的安全

标签 spring-boot spring-security microservices spring-cloud netflix-zuul

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

去年关闭。




Improve this question




我有一个带有 4 个微服务、eureka 服务器和一个集中式 API 网关的 spring-boot 应用程序。
所有外部流量都通过我的 API 网关到达我的微服务。
我的 API 网关 (Zuul) 正在验证和验证 JWT token 。
JWT token 由我的微服务之一在用户登录后生成(用户微服务),该 token 包含用户 ID 及其角色/权限。
现在,我想对网关以外的微服务中存在的方法实现基于角色的安全性。
我曾尝试使用 @PreAuthorize但它在网关之外不起作用(显然为了使其工作,我必须在我的微服务中的 SecurityContextHolder 中设置一个 Spring Security 身份验证对象并用权限填充它)。
那么是否有任何解决方案可以实现这种安全性?
在微服务架构中设置安全性的最佳设计是什么?
API 网关级别的身份验证和微服务级别的授权?
在 API 网关级别验证 JWT 之后,我是否需要在微服务中使用 spring security 或仅传递角色(将它们附加到请求中),例如创建我自己的注释并使用 Spring AOP 处理授权?

最佳答案

Spring5 microservices您将能够找到一个基础来开发具有您正在寻找的几个必要条件的微服务架构:

  • Registry server使用 Eureka 。
  • Gateway server与祖尔。

  • 关于安全性,我开发了两种不同的微服务:
  • Spring Oauth2 with Jwt
  • Spring Jwt用于访问和刷新 Jwt token 的多应用程序安全服务,具有多种自定义设置,例如:定义每个 token 的内容、使用 JWS 或 JWE 等

  • 最重要的是使用 Swagger 进行了详细记录 ,如您所见 here ,并且所有记录的 API 都可以使用唯一的网关 URL 访问。
    对于每个微服务的所有类, Junit 测试 被开发。

    安全
    在这一点上,我做出了几个决定:
    1. 网关不是验证安全性的微服务。
    因为使用网关作为“防火墙”是一种不太灵活的方法。我想决定哪些微服务需要安全性,每个人都应该在内部管理角色可以访问每个端点。总之,每个微服务都必须使用授权/身份验证,但不需要知道该功能是如何完成的。
    2. 特定的微服务来处理安全问题
    正如我告诉你的,我开发了 2 个不同的,因为我想用不同的选项/方法“玩”。最重要的优点是封装,如果“明天”我决定通过任何其他选项更改 Jwt,我只需要修改那些,使用它们的微服务将保持相同的代码(我将很快解释如何集成已完成)

    安全集成示例
    我将解释安全功能是如何在以下各项之间集成的:
  • Pizza service作为架构的一部分开发的简单微服务。
  • Spring Jwt

  • 1. 每个管理用户和角色的应用程序都将在安全微服务中包含一个类似于 next one 的文件夹。 ,定义其模型,存储库以获取所需信息等
    2. 定义了安全微服务的全局端点 here .如您所见,它们基本上与 2 个 Dto 一起工作:
  • AuthenticationInformationDto
  • UsernameAuthoritiesDto

  • 主要优点是,只有安全微服务知道有关该功能如何完成的详细信息,使用它的其他微服务将收到一个众所周知的 Dtos,其中包含所需的信息。
    3. 在pizza-service中,安全集成主要定义在接下来的3个类中:
  • SecurityContextRepository从标题中获取授权 token 并将其发送到 SecurityManager .
  • SecurityManager调用 security-jwt-service使用提供的“授权 token ”(它不知道它是 Jwt 还是其他任何东西)并收到一个众所周知的 UsernameAuthoritiesDto (将其转换为 Spring 类的对象 UsernamePasswordAuthenticationToken)
  • WebSecurityConfiguration全局安全配置。

  • 现在,您可以在端点中包含所需的基于角色的安全性:
  • Controller example
  • Custom PreAuthorize annotation

  • 最后的考虑
  • pizza-service是使用 Webflux 开发的,您可以在 order-service 中看到基于 MVC 微服务的等效集成here (在这种情况下,我使用了“其他安全服务”,但很容易适应它)。
  • 为了提高安全性并遵循“Oauth 方法”,请求 security-jwt-service也需要包括基本身份验证。正如您在 SecurityManager 中看到的那样类(class):
    private String buildAuthorizationHeader(String username, String password) {
      String auth = username + ":" + password;
      byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes());
      return "Basic " + new String(encodedAuth);
    }
    

  • 数据库中用于存储该信息的表与用于管理每个应用程序的安全配置的表相同:security.jwt_client_details

    关于spring-boot - 如何在微服务架构中实现基于角色的安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59786338/

    相关文章:

    c# - 从 Docker 中的另一个微服务调用微服务

    java - 如何使用 Spring Boot Data JPA 在一对多映射的子实体中设置parentId

    java - 在 Spring boot fat jar 中读取文件

    java - Spring OAuth2 配置流程。我是否需要自己的登录 Controller 来登录用户以提供资源服务访问?

    grails - 升级到 Grails 2.4 : ClassNotFoundException: org. springframework.web.filter.GenericFilterBean

    Spring Security 5.2 密码流程

    c# - 我应该在哪里过滤微服务架构模式中的 MS 级外部服务响应?

    java - 如果我使用使用 STS 的 java 8,java 中 List.of() 的替代方法是什么

    java - React 登录页面(客户端)和 spring boot/security(服务器端)

    architecture - 可以使用 Keycloak 作为用户数据库吗?