38

我想通过 Spring Cloud 来介绍 Zuul 作为 API Gateway 前面的几个服务。

我对身份验证有一些设计疑问。身份验证将由 Spring Security 处理,它在 servlet 过滤器链中位于 Zuul 之前。

我的顾虑:

  • 网关将位于许多服务的前面

  • 某些服务可能会暴露不需要身份验证的端点

  • 某些服务可能会暴露需要 Session Id 的端点,而有些则带有令牌”、任意不透明值(例如,如果您知道“难以猜测”的 url,则下载文件)在 API Gateway/Spring Security 中,您可以配置所有具有特定身份验证要求的端点。

在管理 API 网关方面:

  • 您如何强制实际的服务团队为每个下游服务提供所需的设置?
  • 您如何允许网关中频繁的身份验证设置更改(根据服务需要)而不必停止整个网关?

谢谢,阿德里安

4

2 回答 2

27

我们使用 Spring Session 在 Zuul 边缘服务器后面的所有服务中复制会话。Zuul 将对填充用户凭据的用户进行身份验证并将经过身份验证的用户插入会话中。然后将其复制到所有服务中,每个服务负责自己的安全规则和设置。所以说真的,Zuul 所做的只是在 Spring Security 中查找用户,并且后端的服务正在执行安全规则,因为它们适用于他们的需求。这样,您可以独立更改每个服务,使网关只是一个哑代理。

一个很好的例子是 Dave Syers 关于Spring Security 和 Angular JS 应用程序的教程。我还发布了另一个与此相关的问题,其中包含我们如何执行此操作的示例,这可能会有所帮助。

于 2015-11-25T16:59:03.907 回答
6
  • 网关将位于许多服务的前面

这里有什么问题?

  • 某些服务可能会暴露不需要身份验证的端点

Spring Security 有permitAll()访问规则

  • 某些服务可能会暴露需要 Session Id 的端点,而有些则带有令牌”、任意不透明值(例如,如果您知道“难以猜测”的 url,则下载文件)在 API Gateway/Spring Security 中,您可以配置所有具有特定身份验证要求的端点。

你的 Zuul 代理可以有会话。如果您使用的是 Spring Security OAuth 2.0,您可以在每次收到有效访问令牌时使用ResourceServerSecurityConfigurer#stateless(false)和激活会话来创建会话。HttpSecurity#sessionManagement().sessionCreationPolicy(...)JSESSIONID Cookie 将放置在 HTTP 响应中。

  • 您如何强制实际的服务团队为每个下游服务提供所需的设置?

我不确定我是否理解这里的问题,您不想在 API 网关(zuul 代理)级别强制执行安全约束吗?或者您是否尝试在代理和目标应用程序上进行“安全双重检查”?

  • 您如何允许网关中频繁的身份验证设置更改(根据服务需要)而不必停止整个网关?

Zuul 允许您ZuulRoute在运行时动态添加 s,如果您将其用作独立库。包装在 Spring Security 中,其上下文在启动时初始化一次......我怀疑你可以在运行时轻松更改安全配置。

编辑评论中 OP 的精确度:如果您的团队应该对他们的安全规则负责,那么拥有集中式网关在设计上是矛盾的。

我对微服务理念的解释是,每个应用程序都是独立的,负责其全部功能范围,安全/访问控制是其中的一部分。您可以轻松地在应用程序级别验证令牌(通过调用授权服务器或使用 JWT),每个应用程序定义每个资源所需的范围。Spring Cloud 已经有一个OAuth 2.0 启动器,或者如果您使用“普通”Spring Boot,您可以轻松创建一个。

这样,您可以在任何您想要的位置(公共云或本地服务器)部署单个应用程序,而无需依赖上游组件来确保安全性或与其他团队同步您的网关配置部署。

API 网关的事情是一个简单的诱惑,但不要忽视风险和约束:

  • 您将无法保护内部通话
  • 您将不得不依赖上游网络组件,并将应用程序的输入视为理所当然
  • 高级访问控制规则可能会让人头疼:如何获取用户的个人权限等
  • 您必须与其他团队同步配置更改
于 2015-11-25T17:30:49.733 回答