spring - 从所有其他微服务获取当前经过身份验证的用户

标签 spring spring-security microservices

我正在使用 spring 创建一个具有微服务架构的项目。我有 zuul 用于集中安全管理,以及其他一些微服务。
要访问当前经过身份验证的用户,在 zuul 中,我使用以下代码行:

SecurityContextHolder.getContext().authentication

但是为了从其他微服务中获取用户,我从每个请求的 header 中提取 token (jwt),然后从声明中提取用户信息,但我发现这种方法有点烦人。
那么,还有其他更漂亮的方法吗?
我尝试在其他微服务中添加 spring security 的依赖项以使用:
SecurityContextHolder.getContext().authentication

但是每次我通过 zuul 执行请求时,即使从那里完成身份验证,我也会收到一条未经授权的错误消息,尽管已经禁用了这些微服务的安全自动配置。

有什么建议吗?

最佳答案

在 Spring SecurityContext 中设置主体对象之前,使用 SecurityContextHolder.getContext().authentication 不会在其他微服务中工作。

我不知道你为什么要在 Zuul 的安全上下文中设置主体并在那里提取相同的主体,但是是的,身份验证和 token 验证应该在 Zuul 完成,并且相同的 jwt 应该发送到 header 中的后端微服务。
现在在后端微服务中,通过使用 spring security,从 jwt 中提取所需的声明并放入 SecurityContextHolder 一次,以便您也可以进一步将其用于请求授权或方法级授权。

关于spring - 从所有其他微服务获取当前经过身份验证的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57621106/

相关文章:

java - 微服务如何处理长调用链

Spring 数据替代品

java - 多个应用请求的条件同步

grails - 使用 Grails 2.x 和 Spring Security 插件实现字段级安全

java - eureka 中所有注册微服务的 swagger 配置

.net - 使用azure AD的 Multi-Tenancy 微服务架构

java - Kotlin+spring+mustache @Controller 不工作(Whitelabel 错误页面)但 @RestController 工作

java - Spring Cloud Eureka : changing heartbeat and discovery path

java - Spring Boot 安全主体用户更改为新登录的用户详细信息

authentication - 如何使用acegi将已登录用户的ID传递给Grails中我选择的 Controller