我正在使用 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/