使用Spring Security保护REST微服务

时间:2017-01-12 16:41:21

标签: spring spring-security microservices

我正在寻找一种最佳实践和有效的解决方案,以保护多个微服务通过REST与Web客户端应用程序进行通信。

当前设置

这些微服务是用Java构建的,使用Spring Framework并运行到Docker容器中。

客户端是Angular 2应用程序。

我制作了一个新的μService,它将充当“网关”,并且是我的网络客户端和我的其他服务之间的唯一通信点。

我从远程身份验证API检索JWT加密令牌(让我们称之为LOCK)

解决方案我在考虑

enter image description here

我可以将登录JWT存储到cookie中,然后将其发送到网关。

网关嵌入最终有效负载,发送给相关的μService令牌,如果用户是新用户,则存储用户。

然后微服务获取查询,在远程认证服务中检查用户角色,如果足够,则返回200状态结果。

修改

我们需要在我们的μServices配置单元中安装RabbitMQ Broker,从而使用WebSockets。为了以与保护REST API相同的方式保护WebSockets,我不确定我们是否仍应该在网关中管理安全性,并且可能自己在微服务级别管理它。因为很多消息都会传输,我们应该摆脱一个会减慢这个东西的中间件。

问题

这是一个好习惯吗?什么可以做得更好?你有没有做过满足同样需求的事情的例子?非常感谢您的分享和想法。

3 个答案:

答案 0 :(得分:2)

我建议你看看Dave Sayer关于这个主题的精彩网络研讨会。他建议了几种可能的选择,从Spring会话到OAuth2不等。

您可以在此处找到网络研讨会:https://spring.io/blog/2014/11/07/webinar-replay-security-for-microservices-with-spring-and-oauth2

还有一个包含代码示例的教程,但我现在找不到它。

答案 1 :(得分:1)

我会通过以下方式做到这一点:

考虑到每个微服务都在 apigateway 后面,即使是身份验证/授权微服务 -> 我们简单地称之为 auth

一旦请求到来,apigateway 就会检查 auth 服务,auth 服务会做它需要做的事情来验证令牌和请求者是否合法,并用 200/401(/403) 响应 apigateway。< /p>

如果 apigw 得到 200,它会将请求转发到该端点上的任何微服务,否则返回其他状态。

如果我们考虑这种情况,并且它是通过 apigateway 进入您环境的唯一入口点,我认为您没有任何理由确保其他服务之间的通信安全。

让我们考虑一下这个场景:

client -> calls POST /api/v1/cars

  1. 在客户端和 apigw 之间,我们有一个安全调用,因为显然我们将使用证书......因此客户端将调用 https://..../api/v1/cars
  2. 请求到达 apigw,它解密请求
  3. 获取 jtw
  4. asks auth -> 这个返回 200
  5. 将请求转发给CarsMicroservice
  6. Cars 微服务信任该请求,因为它知道其他人已经进行了 JTW 签名解密,因此可以安全地假设其中的任何信息都是合法的
  7. 如果 carsMicroservice 需要一些特定于用户的信息,例如这是一篇用于创建新车的帖子,出于某种原因而不是使用 JWT 令牌中的 subject 字段,即用户的 uuid,我们需要一个用户名 -> 汽车关联,因此当请求到达 carsMicroservice 时,它​​将 DECODE 有效负载,获取用户 uid,要求 userMicroservice 返回有关具有该 uid 的用户的所有信息。这种通信不需要安全,因为它是在所有必要的安全检查之后在内部完成的。

当然,您可以强制执行此操作,即用户可以访问的唯一用户信息是他自己的等,但这些都是自定义启发式的。

答案 2 :(得分:0)

此外,您可能必须在微服务之间建立信任。您可以使用以下组合:

  • 使用LDAP / OAuth2令牌
  • 使用IP白名单
  • CORS规则
  • Https