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

如何在Spring Authorization Server 1.0.0中自定义JWT Token添加userId?

自定义Spring Authorization Server 1.0.0的JWT访问令牌添加userId

不需要重写OAuth2TokenEndpointFilter,Spring Authorization Server提供了官方推荐的令牌定制扩展点——OAuth2TokenCustomizer<JwtEncodingContext>,通过它就能轻松向JWT中添加自定义字段(比如userId)。

实现步骤

1. 自定义Token定制器

创建实现OAuth2TokenCustomizer<JwtEncodingContext>的类,在customize方法中向JWT的claims注入userId:

import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;

public class CustomJwtTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {

    @Override
    public void customize(JwtEncodingContext context) {
        // 从认证上下文获取当前用户的Principal
        Object principal = context.getPrincipal().getPrincipal();
        // 假设你的用户详情类是CustomUserDetails,包含userId属性和getter方法
        if (principal instanceof CustomUserDetails customUserDetails) {
            // 向JWT的claims中添加userId字段
            context.getClaims().claim("userId", customUserDetails.getUserId());
        }
    }
}

2. 注册定制器到授权服务器配置

在授权服务器的配置类中,将自定义的Token定制器注册为Bean,或者通过OAuth2AuthorizationServerConfigurer绑定到JWT生成器:

方式一:直接注册为Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;

@Configuration
public class AuthorizationServerConfig {

    @Bean
    public OAuth2TokenCustomizer<JwtEncodingContext> jwtTokenCustomizer() {
        return new CustomJwtTokenCustomizer();
    }

    // 其他授权服务器配置(如客户端注册、端点配置等)可按需添加
}

方式二:通过SecurityFilterChain配置

如果需要更精细的控制,也可以在SecurityFilterChain中绑定:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
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
public class AuthorizationServerConfig {

    @Bean
    public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
        // 应用授权服务器默认安全配置
        OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);

        // 配置JWT生成器,绑定自定义定制器
        http.getConfigurer(OAuth2AuthorizationServerConfigurer.class)
                .tokenGenerator(tokenGenerator -> 
                        tokenGenerator.jwt(jwt -> jwt.customizer(jwtTokenCustomizer())));

        // 其他配置(如资源服务器关联、登录端点等)
        return http.build();
    }

    @Bean
    public OAuth2TokenCustomizer<JwtEncodingContext> jwtTokenCustomizer() {
        return new CustomJwtTokenCustomizer();
    }
}

关键说明

  • 扩展点设计:OAuth2TokenCustomizer是Spring Authorization Server专门为令牌定制提供的扩展接口,无需修改核心过滤器,符合框架的开闭原则。
  • 用户信息获取:示例中假设用户详情类是CustomUserDetails,你需要根据自己的业务实现调整——比如如果使用默认UserDetails,可以扩展它添加userId属性,或者从其他认证上下文信息中提取用户ID。
  • 版本兼容:该方案完全适配spring-authorization-server 1.0.0版本,无需担心兼容性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 15:27:31