Spring Boot 2、Cloud Netflix 和用户名/密码认证架构

Posted

技术标签:

【中文标题】Spring Boot 2、Cloud Netflix 和用户名/密码认证架构【英文标题】:Spring Boot 2, Cloud Netflix and username/password authentication architecture 【发布时间】:2020-07-23 14:08:22 【问题描述】:

这是一个架构问题。我想实现一个处理两种用户(管理员和客户端)的应用程序。每个角色可以通过以下方式注册:

admin:用户名/密码注册 客户端:Facebook/Google/用户名和密码注册

根据用户的角色,他们每个人都有他有权执行的特定操作。

从技术堆栈来看,我想在 Docker 和 Kubernetes 上使用 Java 8、Spring Cloud Netflix 以及更高版本(以实现自动修复和自动扩展)。

我已经实现了 Eureka 发现、配置服务器、Zuul 网关,并且每个角色都有两个微服务(让我开始使用)。我根本不知道如何处理用户的身份验证/授权,从我看到的 Spring Security 5 不再支持授权服务器,我应该使用 Keycloack?网关应该是授权服务器还是应该创建另一个负责身份验证的组件?我使用什么,如何实现,如何处理我的授权服务器和业务微服务之间的重定向?

我真的找不到使用用户名/密码、社交登录和 Spring Cloud Netflix 以及 Spring Security 5 的合适文档。

【问题讨论】:

如今,有几个授权服务器可供选择,包括 Keycloak。然而,Spring Security 团队暗示他们可能会重新考虑他们的决定:github.com/spring-projects/spring-security/issues/… 【参考方案1】:

您的网关不应负责处理身份验证。

一种可能性是使用 cas 项目。它可以作为微服务运行来处理整个身份验证过程。它可以处理多种身份验证方法,例如数据库(用于用户名/密码)和 Google 或 Facebook 等社交媒体。

它带有一个基本设置,有一个登录页面和一个配置的 DockerFile。您可以自定义所有内容。只需添加相关依赖并在application.properties中添加配置即可。您可以自定义前端。

https://apereo.github.io/cas/6.1.x/planning/Getting-Started.html

顺便说一句:如果您使用 kubernetes,则不需要使用 eureka 进行网关或服务发现。 Kubernetes 会为您做到这一点。

【讨论】:

感谢您向我介绍 CAS。只有网关应该注册到 CAS 或每个微服务?在对不同服务的多次休息调用之间如何保存会话(我不希望用户登录任何使用不同服务的新请求)? 我已经通过使用 jwt 解决了这个问题。登录后,cas 向我发送了一个令牌,该令牌存储在浏览器 localStorage 中。微服务使用 spring security 5 来检查令牌是否无效或过期。 抱歉不在公共存储库中。如果答案有帮助,请考虑接受/支持。谢谢!【参考方案2】:
    为了 api 安全,迁移到 #Kubernetes 后,您可以使用 Envoy 或类似的解决方案 对于身份验证和授权,您需要一个身份管理系统(例如 #Okta 或 PingFederate 或开源版本,例如 #OpenIAM),然后使用 Spring 和 OAUTH2 进行集成。

【讨论】:

以上是关于Spring Boot 2、Cloud Netflix 和用户名/密码认证架构的主要内容,如果未能解决你的问题,请参考以下文章

安装 Spring Cloud CLI - Spring boot 2.4.5 的哪个版本

Spring 5.x Spring Boot 2.x Spring Cloud 与常用技术栈整合

升级到 Spring Boot 2.6.1 和 Spring Cloud 2021.0.0 后 Spring Cloud Stream 启动错误

Spring 5.x Spring Boot 2.x Spring Cloud 与常用技术栈整合

Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳

spring boot 2.0.3+spring cloud (Finchley)6配置中心Spring Cloud Config