You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Authorization Server 1.0.0中如何为Token添加用户ID声明

给Spring Authorization Server v1.0.0的Token添加userId声明

要在生成的Token中加入userId这类自定义声明,你可以按照以下步骤操作:

1. 暴露IamUserDetails中的用户ID

首先在你的IamUserDetails类中添加一个公开方法,用来获取数据库中的用户ID:

data class IamUserDetails(
    private val user: User,
) : UserDetails {

    // 新增方法:返回用户ID,类型根据你的User实体调整
    fun getUserId(): Long = user.id

    override fun getAuthorities(): MutableCollection<out GrantedAuthority> = mutableListOf()
    
    override fun getPassword() = user.password
    
    override fun getUsername() = user.email
    
    override fun isAccountNonExpired() = true
    
    override fun isAccountNonLocked() = true
    
    override fun isCredentialsNonExpired() = true
    
    override fun isEnabled() = user.enabled
}

2. 自定义Token生成器

创建一个OAuth2TokenCustomizer实现类,在Token生成过程中注入userId声明:

import org.springframework.security.oauth2.core.oidc.OidcIdToken
import org.springframework.security.oauth2.core.oidc.OidcUserInfo
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer

class CustomJwtTokenCustomizer : OAuth2TokenCustomizer<JwtEncodingContext> {
    override fun customize(context: JwtEncodingContext) {
        // 从认证主体中获取自定义的UserDetails
        val userDetails = context.principal.principal as IamUserDetails
        
        // 给JWT添加userId声明
        context.claims.claim("userId", userDetails.getUserId())

        // 如果需要同时在OIDC UserInfo响应中返回userId,补充以下逻辑
        if (context.tokenType.value == OidcIdToken.TOKEN_TYPE_VALUE) {
            val existingUserInfo = context.get(OidcUserInfo::class.java) ?: OidcUserInfo.builder().build()
            val updatedUserInfo = OidcUserInfo.builder()
                .claims { it.putAll(existingUserInfo.claims) }
                .claim("userId", userDetails.getUserId())
                .build()
            context.put(OidcUserInfo::class.java, updatedUserInfo)
        }
    }
}

3. 配置Authorization Server加载自定义Token处理器

在你的授权服务器配置类中,将自定义的CustomJwtTokenCustomizer注册到Token生成流程中:

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer
import org.springframework.security.web.SecurityFilterChain

@Configuration
class AuthorizationServerConfig {

    @Bean
    fun authorizationServerSecurityFilterChain(http: HttpSecurity): SecurityFilterChain {
        // 应用默认授权服务器安全配置
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http)
        
        // 配置Token自定义器
        http.getConfigurer(OAuth2AuthorizationServerConfigurer::class.java)
            .tokenConfigurer { tokenConfig ->
                // 给Access Token和ID Token都应用自定义逻辑
                tokenConfig.accessTokenCustomizer(CustomJwtTokenCustomizer())
                    .idTokenCustomizer(CustomJwtTokenCustomizer())
            }
        
        return http.build()
    }

    // 注意:这里需要保留你项目中已有的其他Bean配置,比如客户端仓库、用户认证管理器等
}

完成以上配置后,重新生成的Token就会包含userId声明,示例如下:

{
  "sub": "user@example.com",
  "aud": "messaging-client",
  "nbf": 1670443075,
  "scope": ["openid"],
  "iss": "http://localhost:8080",
  "exp": 1670443375,
  "iat": 1670443075,
  "userId": 123 // 新增的用户ID声明
}

内容的提问来源于stack exchange,提问作者Crovitz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:50:29