【发布时间】:2017-05-27 21:02:32
【问题描述】:
我正在寻找一种最佳实践和高效的解决方案来保护通过 REST 与 Web 客户端应用程序进行通信的多个微服务。
当前设置:
这些微服务是用 Java 制作的,带有 Spring 框架并运行到 Docker 容器中。
客户端是一个 Angular 2 应用程序。
我创建了一个新的 µService,它将充当“网关”并且是我的 Web 客户端和我的其他服务之间的唯一通信点。
我从远程身份验证 API 检索 JWT 加密令牌(我们称之为 LOCK)
我正在考虑的解决方案:
我可以将登录 JWT 存储到一个 cookie 中,然后发送到网关。
网关将令牌嵌入到发送给相关 µService 的最终有效负载中,如果用户是新用户,则将其存储到数据库中。
然后微服务获取查询,在远程身份验证服务中检查用户角色,如果足够,则返回 200 状态和结果。
编辑
我们需要在我们的 µServices 配置单元中加入一个 RabbitMQ 代理,这样才能使用 WebSocket。为了以与保护 REST API 相同的方式保护 WebSockets,我不确定我们是否仍然应该在网关中管理安全性,并且可能在微服务级别自行管理它。因为很多消息会传输,我们也许应该去掉一个会减慢传输速度的中间件。
问题:
这是一个好习惯吗?有什么可以做得更好?您是否有任何满足相同需求的示例?非常感谢您的分享和想法。
【问题讨论】:
-
我采用了类似的方法,但在一个方面有所不同。用户 JWT 令牌不会从网关向下传递给服务。网关本身获取客户端令牌并使用它向其他服务验证自己。我选择这种设计的原因是为了让用户的安全性本地化在网关中。并且网关完全被其他服务信任。
-
是的,我告诉自己同样的事情。此外,无论如何都必须存储 JWT 令牌,因此最好将其放置在单个入口点中以避免数据复制(如果需要,网关仍然可以进行水平可扩展性)。为了防止 cookie/会话信息被盗,我可以将数据库版本与存储在 Web 浏览器中的版本进行比较。恼人的效果是,µService 会在彼此之间产生大量 HTTP 流量,而这似乎不是组织这些流量的“好”方式。
-
在我看来,身份验证服务器应该是微服务之一,它可以对授权和身份验证做任何事情。例如管理和存储令牌到数据库,检查用户的权限。其他微服务需要自行检查token是否有效,如果token过期会返回错误码给客户端,客户端会再次调用refresh token。为检查用户的权限,每个微服务都可以调用认证服务器来检查权限。
-
或许也可以看看 istio (istio.io/latest/docs/concepts/security)
标签: spring spring-security microservices