微服务架构中的Spring Security

时间:2020-01-21 01:21:54

标签: spring spring-boot spring-security

我有一个微服务架构,我想保护在Spring Boot中开发的每个微服务的REST API,我应该在每个微服务中使用Spring安全性吗?我有一个身份验证服务,它将是身份验证者和授权者,其他微服务将使用它们的服务来验证令牌,授权?这个对吗?代码有帮助吗?

2 个答案:

答案 0 :(得分:2)

我在项目中采用的方法是拥有一个网关应用程序netflix-zuul(不再积极开发,但更加成熟)或spring-cloud-gateway(由Spring团队开发,是{{1}的后继者) },但作为一个相当新鲜的项目还有一些怪癖。建议用于新应用)

于是,网关将是唯一直接向用户公开的服务,而所有其他服务(身份验证,业务逻辑等)都将放置在DMZ中,并且无法从网络外部访问。

image credit: Microsoft (https://docs.microsoft.com/ja-jp/azure/architecture/microservices/images/gateway.png)

如果遵循上述架构,则只需要在网关服务中实现安全性,并且假设实现和网络设置正确,就无需担心其他服务中的安全性。

在实践中,由于访问令牌承载了在我的业务逻辑中使用的用户标识信息,因此我仍然在每个服务中保留分叉的解析模块。但是,它用于数据传输而不是出于安全目的。

必须配置网关(两种指南之一都可以在线获取大量指南和示例),以了解您的每项服务,或者您可能希望包含zuul(例如{{1 }})来跟踪您所有的服务和实例。

服务注册表是一种轻量级服务,它将为网关服务提供每个服务的动态别名,并在将基础架构扩展到单个PM(物理机)之外时为您节省所有的设置麻烦,并为您几乎不需要任何开发费用

答案 1 :(得分:1)

是的,为了保护所有服务的端点,最好的方法是在所有应用程序中实现Spring Security。您可以有一个执行身份验证和授权的集中式应用程序(例如auth-service)。其他服务将使用身份验证管理器,该管理器将指向远程令牌服务(存在于auth-service中)。通过此操作,您可以为每个应用程序中的各个端点定义安全保护规则,如下所示:

<sec:filter-security-metadata-source id="securityMetadataSource"
                                     request-matcher="ant"
                                     use-expressions="true">
    <sec:intercept-url pattern="/admin/**" access="isFullyAuthenticated() and hasRole('ADMIN')"/>

在上面的示例中,我们声明了一个规则,即所有以/admin/**开头的端点都应该经过身份验证,并且应该具有角色ADMIN

根据您的用例,您可以配置每个服务还需要对自己进行身份验证。这意味着您也可以保护服务内通信。