Zuul - Api网关认证

Adr*_*van 35 spring-cloud netflix-zuul

我想在一些服务面前通过Spring Cloud作为API网关介绍Zuul.

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

我的顾虑:

  • Gateway将坐在许多服务面前

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

  • 某些服务可能会暴露需要会话ID的端点和一些带有令牌的端点",一个任意的不透明值(例如,如果您知道"难以猜测"的URL,则下载文件)在API网关/ Spring Security中,您可以配置所有具有特定身份验证要求的端点.

在管理API网关方面:

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

谢谢,阿德里安

And*_*rff 26

我们正在使用Spring Session在Zuul Edge Server后面的所有服务中复制会话.Zuul将对填充用户凭据的用户进行身份验证,并将经过身份验证的用户插入会话中.然后将其复制到所有服务中,每个服务都负责自己的安全规则和设置.实际上,所有Zuul正在做的就是在Spring安全性中查找用户,并且后端的服务正在执行适用于他们需求的安全规则.这样,您可以独立更改每个服务,使Gateway成为一个愚蠢的代理.

一个很好的例子是关于Spring Security和Angular JS应用程序的 Dave Syers教程.我还发布了另一个与此相关的问题,其中包含了我们如何做到这一点的样本,这可能有所帮助.

  • 困扰我的是,你__ve_通过网关接听呼叫以使下游应用程序正常工作.网关不是那么愚蠢,会话创建仍然是业务逻辑.通过数据存储共享该会话是偷偷摸摸的高耦合,我仍然不明白为什么Spring的人在微服务架构中推荐它. (3认同)
  • 我不知道它是不是_better_,只是一个不同的妥协.来自Pivotal的一些人上周使用与你相同的方法做了一个演示,说它是我的优化:)我选择使用OAuth 2.0保护每个应用程序.应用程序通过对授权服务器进行HTTP调用来验证它们收到的访问令牌,授权服务器返回用户信息.双方都添加了缓存(未共享)以加快进程.应用程序显然是分离的,可以独立测试,代价是使授权服务器成为瓶颈/单点故障. (3认同)
  • 您的方法和关键人物之间的唯一区别是,他保护了每个应用程序(使用没有HTTP调用的JWT来验证令牌),只有用户信息查找依赖于共享缓存. (2认同)

Mic*_*urt 5

  • Gateway将坐在许多服务面前

这里有什么问题?

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

Spring Security具有permitAll()访问规则

  • 某些服务可能会暴露需要会话ID的端点和一些带有令牌的端点",一个任意的不透明值(例如,如果您知道"难以猜测"的URL,则下载文件)在API网关/ 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网关的东西很容易诱惑,但不要忽视风险和限制:

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


归档时间:

查看次数:

29265 次

最近记录:

10 年 前