如何在Spring Authorization Server 1.0.0中自定义JWT Token添加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
相关产品推荐
相关产品推荐

