我正在使用一个 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 获得的响应。 谢谢!
截至 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
重命名为您在转换器中称为用户属性的任何名称。
如果有人找到更好的解释方式,请随时编辑这篇文章。