如何在 Spring OAuth 中获取嵌套的用户名属性

问题描述 投票:0回答:1

我正在使用一个 OAuth 提供程序,遗憾的是它没有您期望的用户信息端点

/oauth/userinfo
。相反,他们在
/api/me
提供了资源,我可以在其中查看我现在是哪个用户。 JSON 响应在包装对象中构造如下:

{
  "data": {
    "username": "here goes the username",
    "email": "[email protected]"
  },
  "meta": {
    "version": "api version and some other metadata"
  }
}

我的

application.properties
包含一行应使用用户名指定属性,以便Spring可以检测到这是哪个用户:

spring.security.oauth2.client.provider.my_auth_provider.user-name-attribute=email

但是,这似乎只支持 JSON 对象内部第一级的项目,目前是

data
meta

我尝试使用不同的分隔符。其中包括句号

.
、逗号
,
、空格
 
、大于
>
、连字符
-
和下划线
_
。它们都不起作用。有一个 GitHub-Issue 涵盖了这个问题,它似乎已被合并,但我在源代码中没有看到任何内容。

有人有同样的问题或知道解决办法吗?我无法更改从 API 获得的响应。 谢谢!

spring spring-security
1个回答
0
投票

截至 2024 年 4 月:

警告:此解决方案要求您使用默认版本中不包含的 Spring Security 里程碑版本

1。更新依赖项(build.gradle.kts)
将 spring-boot-starter 安全依赖项替换为:

implementation("org.springframework.security:spring-security-core:6.3.0-M3")
implementation("org.springframework.security:spring-security-config:6.3.0-M3")
implementation("org.springframework.security:spring-security-oauth2-client:6.3.0-M3")

将 Spring Security Milestone 存储库添加到您的

repositories
:

maven { url = uri("https://repo.spring.io/milestone") }

2。添加属性转换器(SecurityConfiguration.kt)

@Bean
fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
    return http
        .authorizeHttpRequests { auth ->
            auth.requestMatchers("/").permitAll()
            auth.anyRequest().authenticated()
        }
        .oauth2Login { oauth2 ->
            oauth2.userInfoEndpoint {
                it.userService { request ->
                    val service = DefaultOAuth2UserService()
                    val converter = Converter<OAuth2UserRequest, Converter<Map<String, Any>, Map<String, Any>>> {
                        Converter { input ->
                            val data = input["data"] as Map<String, *>
                            val result = input.toMutableMap()
                            result["email"] = data["email"] as Any
                            result
                        }
                    }
                    service.setAttributesConverter(converter)
                    service.loadUser(request)
                }
            }
        }
        .build()
}

您需要在属性的根级别获取所需的用户信息属性。这个功能是在 Spring Security

6.3.0-M3
中引入的,这就是为什么当需要这个版本或更新版本时。 这里是Spring Security存储库中对应的源代码。

3.更新您的 application.properties 最后,您必须将

user-name-attribute
重命名为您在转换器中称为用户属性的任何名称。

如果有人找到更好的解释方式,请随时编辑这篇文章。

© www.soinside.com 2019 - 2024. All rights reserved.