我想在一些服务面前通过Spring Cloud作为API网关介绍Zuul。
我对身份验证有一些设计疑虑。 身份验证将由Spring Security处理,它位于servlet过滤器链中的Zuul之前。
我的担心:
Gateway将坐在许多服务之前
某些服务可能会暴露不需要身份验证的端点
某些服务可能会暴露需要会话ID的端点和一些带有令牌的端点“,一个任意的不透明值(例如,如果您知道”难以猜测“的网址,则下载文件) 在API Gateway / Spring Security中,您可以使用特定的身份验证要求配置所有端点。
在管理API网关方面:
谢谢, 阿德里安
答案 0 :(得分:24)
我们正在使用Spring Session在Zuul Edge Server后面的所有服务中复制会话。 Zuul将对填充用户凭据的用户进行身份验证,并将经过身份验证的用户插入会话中。然后将其复制到所有服务中,每个服务都负责自己的安全规则和设置。实际上,所有Zuul正在做的就是在Spring安全性中查找用户,并且后端的服务正在执行适用于他们需求的安全规则。这样,您可以独立更改每个服务,使Gateway成为一个愚蠢的代理。
这方面的一个很好的例子是关于Spring Security and an Angular JS app的Dave Syers教程。我还发布了与此相关的another question,其中包含了我们如何做到这一点的示例,这可能有所帮助。
答案 1 :(得分:5)
- 网关将坐在许多服务面前
这里有什么问题?
- 某些服务可能会暴露不需要身份验证的端点
Spring Security有一个permitAll()
访问规则
- 某些服务可能会暴露需要会话ID和端点的端点 用一个标记“,一个任意的不透明值(例如下载一个 文件,如果你知道一个“难以猜测”的网址)在API网关/春天 安全性您可以使用特定端点配置所有端点 身份验证要求。
您的Zuul代理可以有会话。如果您使用的是Spring Security OAuth 2.0,则可以使用ResourceServerSecurityConfigurer#stateless(false)
并使用HttpSecurity#sessionManagement().sessionCreationPolicy(...)
激活会话,以便在每次收到有效的访问令牌时创建会话。 JSESSIONID Cookie将放在HTTP响应中。
- 如何强制实际的服务团队为每个下游服务提供所需的设置?
我不确定我是否理解这里的问题,您不想在API网关(zuul代理)级别强制执行安全约束吗?或者您是否尝试在代理和目标应用程序上进行“安全双重检查”?
- 如何在网关(根据服务需求)中频繁更改身份验证设置而不必停止整个网关?
Zuul允许您在运行时动态添加ZuulRoute
,如果您将其用作独立库。包含在Spring Security中,其上下文在启动时初始化一次......我怀疑您可以在运行时轻松更改安全配置。
在评论中遵循OP的精确编辑:如果您的团队应对其安全规则负责,那么集中式网关在设计上是矛盾的。
我对微服务理念的解释是每个应用程序都是独立的,并且负责其全部功能范围,并且安全/访问控制是其中的一部分。您可以在应用程序级别轻松验证令牌(通过调用授权服务器或使用JWT),每个应用程序定义每个资源需要哪个范围。 Spring Cloud已经有OAuth 2.0 starter,或者你可以轻松创建一个如果使用“普通”Spring Boot。
通过这种方式,您可以在任何地方(公共云或本地服务器)部署单个应用程序,而无需依赖上游组件来提高安全性或将网关配置部署与其他团队同步。
API网关很容易诱惑,但不要忽视风险和限制: