Spring cloud Zuul-Api网关认证

Spring cloud Zuul-Api网关认证,spring-cloud,netflix-zuul,Spring Cloud,Netflix Zuul,我想通过SpringCloud将Zuul作为API网关介绍给一些服务 我对认证有一些设计上的疑问。 身份验证将由Spring Security处理,它位于servlet过滤器链中的Zuul之前 我关注的是: 网关将位于许多服务的前面 某些服务可能会公开不需要身份验证的端点 有些服务可能会公开需要会话Id的端点,有些端点带有“令牌”,这是一个任意不透明的值(例如,如果您知道“难以猜测”的url,则下载文件) 在API网关/Spring安全性中,您可以配置具有特定身份验证要求的所有端点 在管理A

我想通过SpringCloud将Zuul作为API网关介绍给一些服务

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

我关注的是:

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

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

  • 有些服务可能会公开需要会话Id的端点,有些端点带有“令牌”,这是一个任意不透明的值(例如,如果您知道“难以猜测”的url,则下载文件) 在API网关/Spring安全性中,您可以配置具有特定身份验证要求的所有端点

在管理API网关方面:

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

我们正在使用Spring会话在Zuul边缘服务器后面的所有服务中复制会话。Zuul将对填充用户凭据的用户进行身份验证,并将经过身份验证的用户插入会话。然后在所有服务中复制该会话,每个服务负责自己的会话安全规则和设置。因此,实际上,Zuul所做的只是在spring security中查找用户,后端的服务根据用户的需要强制执行安全规则。这样,您可以独立更改每个服务,使网关成为一个哑代理

这方面的一个很好的例子是Dave Syers关于的教程。我还发布了与此相关的文章,其中包含了我们如何做的示例,这可能会有所帮助

  • 网关将位于许多服务的前面
这里的担忧是什么

  • 某些服务可能会公开不需要身份验证的端点
Spring Security有一个
permitAll()
访问规则

  • 一些服务可能会公开需要会话Id和一些 使用“令牌”,则为任意不透明值(例如下载 文件(如果您知道API网关/Spring中的“难以猜测”url) 安全性您可以使用其特定的 认证要求
您的Zuul代理可以有会话。如果您使用的是Spring Security OAuth 2.0,则可以使用
ResourceServerSecurityConfigure#无状态(false)
并使用
HttpSecurity#sessionManagement().sessionCreationPolicy(…)
激活会话,以便在每次收到有效访问令牌时创建会话。将在HTTP响应中放置JSESSIONID Cookie

  • 您如何强制实际的服务团队为每个下游服务提供所需的设置
我不确定我是否理解这里的问题,您不想在API网关(zuul代理)级别强制实施安全约束吗?或者您正在尝试对代理和目标应用程序进行“安全双重检查”

  • 如何允许在网关中频繁更改身份验证设置(根据服务需要),而不必停止整个网关
Zuul允许您在运行时动态添加
ZuulRoute
s,前提是您将其用作独立的库。包装在Spring Security中,其上下文在启动时初始化一次。。。我怀疑您能否在运行时轻松更改安全配置

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

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

这样,您就可以在任何地方部署单个应用程序(公共云或内部部署服务器),而无需依赖上游组件来实现安全性,也无需与其他团队同步网关配置部署

API网关很容易吸引人,但不要忽视风险和约束:

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

好的。我需要更好地解释。我主要关心的是,我想让服务团队有机会和责任在网关中编辑属于其服务的身份验证设置。我不希望网关成为组织的瓶颈。在路由方面,事情看起来更好,因为正如您所说,您可以动态添加路由筛选器,因此每个团队都可以以某种方式提供这些筛选器。其想法是在网关中处理身份验证,并在服务级别使主体准备好使用,并且只对服务对服务进行身份验证(请求是从我信任的服务接收的)如果没有应用程序级安全性,“从我信任的服务接收到请求”是无法验证的。关于让您的安全性依赖于网关填充的某个共享状态:它在组件之间引入了许多不可见的耦合,并且上游依赖于“网关做了什么或没有做什么”,