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

Spring OAuth2 Authorization Server如何在token中添加用户角色信息

实现方案说明

该需求完全可以实现,spring-security-oauth2-authorization-server 0.2.0版本提供了Token自定义扩展点,可通过注入自定义的Token增强器将角色信息写入JWT的claims中,具体实现步骤如下:

步骤1:实现JWT编码自定义处理器

实现OAuth2TokenCustomizer<JwtEncodingContext>接口,从上下文中取出认证信息里的角色列表,写入JWT的自定义claim:

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.jwt.JwtClaimsSet;
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;
import java.util.stream.Collectors;

public class CustomJwtTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {
    @Override
    public void customize(JwtEncodingContext context) {
        JwtClaimsSet.Builder claimsBuilder = context.getClaims();
        // 从认证信息中获取用户权限(角色)列表
        var authorities = context.getPrincipal().getAuthorities();
        // 将角色列表写入claims,key可自定义为roles、authorities等
        claimsBuilder.claim("roles", authorities.stream()
                .map(GrantedAuthority::getAuthority)
                .collect(Collectors.toList()));
    }
}

步骤2:将自定义处理器注册为Spring Bean

直接将该类实例注入Spring容器即可自动生效,无需额外配置绑定:

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

补充说明

  • 如果使用的是不透明令牌(Opaque Token)而非JWT,可改为实现OAuth2TokenCustomizer<OAuth2TokenClaimsContext>接口,逻辑和上述实现完全一致。
  • 若不需要Spring Security默认的ROLE_前缀,可在写入claims时做字符串截取,比如authority.replaceFirst("ROLE_", "")。
  • 配置完成后重新发起授权流程获取令牌,解码JWT即可在payload中看到自定义的roles字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 22:15:03