如何仅在 Spring 中为微服务项目的外部客户端启用身份验证?

Posted

技术标签:

【中文标题】如何仅在 Spring 中为微服务项目的外部客户端启用身份验证?【英文标题】:How can I enable auth only for external clients in Spring for a microservices project? 【发布时间】:2021-08-31 10:02:42 【问题描述】:

我正在开展一个项目,我正在使用微服务来处理我的业务逻辑的各个部分。我当前的实现使用 JWT 令牌来验证请求。出于性能原因,我需要模块间请求以跳过令牌生成或身份验证步骤并且始终被允许。

我想到的一种方法是将我的项目模块配置为使用可以说是“无限”到期的令牌。这是一种合适的方法还是有更好的方法来实现我想要的。

提前致谢!

【问题讨论】:

不,我会说这可能是一个很大的安全问题......相反,请查看docs.spring.io/spring-security/site/docs/3.0.x/reference/… 第 15.2 节并禁用特定网络的身份验证(在这种情况下,您用于微服务的网络) 感谢您的链接。我将看看将特定 IP 列入白名单。你能解释一下为什么我最初的想法可能是一个安全问题吗?有什么特殊情况或条件可能会出现问题? 嗯,你可以这样做,它会成为一个 API 令牌(一个没有过期日期的令牌......) 【参考方案1】:

最后对我有用的方法是一种服务,它以比令牌到期时间短几秒的时间间隔创建刷新的 JWT 令牌。

然后一个 RestInterceptor 将此 Bearer 令牌添加到所有用于模块间通信的请求(通过匹配的主机名检测)。

所有这些都包含在每个模块中使用的安全 JAR 中。这还具有允许每个模块拥有自己的身份验证端点(私钥是共享的)的优点,因此即使一个服务以某种方式关闭,其他服务仍然可以访问。

【讨论】:

【参考方案2】:

如果你只关心身份验证而不关心授权,我的意思是,如果你想确保某个微服务只能被特定的微服务调用,但你并不关心这个服务上调用了什么操作或端点,你可以使用双向 tls。

除了服务器之外,使用这种机制,HTTP 连接中的客户端必须使用证书对自己进行身份验证。通过这样做,客户端和服务器都信任另一部分,并且可以对通信进行身份验证。

这样做你可以忘记令牌及其到期时间

【讨论】:

是的,我现在只是在寻找授权。谢谢!我会研究这种方法

以上是关于如何仅在 Spring 中为微服务项目的外部客户端启用身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 为微服务创建自定义安全过滤器

在 Docker 中将 Spring-cloud-config 服务器托管为微服务

如何仅在角度中为礼品卡模块添加提供者、服务和拦截器?

如何在 android studio 中为 IBM MobileFirst 项目导入外部库项目?

Spring-boot 资源服务器仅在过期时验证令牌

如何在Gradle中为单个测试类并行执行JUnit测试