[英]Securing REST microservices with Spring Security
我正在寻找一种最佳实践和高效的解决方案来保护通过 REST 与 Web 客户端应用程序通信的多个微服务。
当前设置:
这些微服务是用 Java 制作的,使用 Spring 框架并运行到 Docker 容器中。
客户端是一个 Angular 2 应用程序。
我创建了一个新的 µService,它将充当“网关”,并且是我的 Web 客户端和我的其他服务之间的唯一通信点。
我从远程身份验证 API 检索 JWT 加密令牌(我们称之为 LOCK)
我正在考虑的解决方案:
我可以将登录 JWT 存储到 cookie 中,然后将其发送到网关。
网关将令牌嵌入到发送给相关 µService 的最终有效载荷中,并将用户(如果用户是新用户)存储到数据库中。
然后微服务获取查询,在远程身份验证服务中检查用户角色,如果足够,则返回 200 状态和结果。
编辑
我们需要在 µServices hive 中安装一个 RabbitMQ Broker,从而使用 WebSockets。 为了以与保护 REST API 相同的方式保护 WebSockets,我不确定我们是否仍然应该在网关中管理安全性,或者在微服务级别单独管理它。 因为会传输大量消息,我们也许应该摆脱会减慢传输速度的中间件。
问题:
这是一个好习惯吗? 什么可以做得更好? 你有什么例子可以满足相同的需求吗? 非常感谢您的分享和想法。
我建议你看看Dave Sayer关于这个主题的精彩网络研讨会。 他建议了几种可能的选择,从Spring会话到OAuth2。
您可以在此处找到网络研讨会: https : //spring.io/blog/2014/11/07/webinar-replay-security-for-microservices-with-spring-and-oauth2
还有一个代码示例的教程,但我现在找不到它。
我会通过以下方式做到这一点:
考虑到每个微服务都在 apigateway 后面,即使是身份验证/授权微服务 -> 让我们简单地称之为auth
。
一旦请求到来,apigateway 就会检查 auth 服务,auth 服务会做它需要的事情来验证令牌和请求者是否合法,并用 200/401(/403) 响应 apigateway。
如果 apigw 得到 200,它会将请求转发到该端点上的任何微服务,否则返回其他状态。
如果我们考虑这种情况,并且它是通过 apigateway 进入您环境的唯一入口点,我认为您没有任何理由保护其他服务之间的通信。
让我们考虑这个场景:
client -> calls POST /api/v1/cars
https://..../api/v1/cars
CarsMicroservice
subject
字段,即用户的uuid,我们需要一个用户名->汽车关联当请求到达carsMicroservice时,它会对payload进行DECODE
,获取用户uid,要求userMicroservice返回该用户的所有信息。 这种通信不需要是安全的,因为它是在所有必要的安全检查之后在内部完成的。当然,您可以强制执行此操作,即用户可以访问的唯一用户信息是他自己的等,但这些是自定义启发式的。
此外,您可能必须在微服务之间建立信任。 您可以使用以下组合:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.