Spring boot 在spring boot microservice的JWT令牌生成中设置两个主题

Spring boot 在spring boot microservice的JWT令牌生成中设置两个主题,spring-boot,jwt,microservices,Spring Boot,Jwt,Microservices,我正在尝试为我的微服务生成JWT令牌。该令牌将使用我的前端应用程序访问服务。在这里,我通过添加我的用户名来设置主题。我需要添加用户id和用户名。下面是我用来生成令牌的代码,只添加了主题“username” 我的密码是 protected String getToken(String encodedSecret, Users jwtUser){ return Jwts.builder() .setId(UUID.randomUUID().toString())

我正在尝试为我的微服务生成JWT令牌。该令牌将使用我的前端应用程序访问服务。在这里,我通过添加我的用户名来设置主题。我需要添加用户id和用户名。下面是我用来生成令牌的代码,只添加了主题“username”

我的密码是

protected String getToken(String encodedSecret, Users jwtUser){
    return Jwts.builder()
            .setId(UUID.randomUUID().toString())
            .setSubject(jwtUser.getUsername())
            .signWith(SignatureAlgorithm.HS512, encodedSecret)
            .compact();
}

这里我需要添加两个主题用户名和userid。如何在此处添加两个主题?

您不能有两个或多个同名的声明:

JWT声明集表示一个JSON对象,其成员是 联合工作组转达的索赔。JWT索赔集中的索赔名称 必须是独一无二的;JWT解析器必须拒绝带有重复项的JWT 声明名称或使用只返回词汇上最后一个名称的JSON解析器 重复的成员名称[…]

但是,您可以对用户id使用另一个声明:

返回Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(jwtUser.getUsername())
.signWith(SignatureAlgorithm.HS512,编码保密)
.claim(“用户id”,“id在此显示”)
.compact();

我可以添加对象而不是整数吗?比如JSON

是的,声明值可以是任意JSON值,但声明名称必须是字符串:

[……]

索赔名称
索赔陈述的名称部分。索赔名称为 总是一根线**

索赔价值
索赔陈述的价值部分。索赔价值可以是 任何JSON值

[……]

JWT将一组声明表示为在 JWS和/或JWE结构。这个JSON对象是JWT声明集。 […]JSON对象包括 零个或多个名称/值对(或成员),其中名称为 字符串和值是任意JSON值。这些成员是 JWT代表的权利要求。[……]

因此,您可以定义一个类,如:

类用户详细信息{
私有整数id;
私有列表角色;
公共用户详细信息(整数id、字符串…角色){
this.id=id;
this.roles=Arrays.asList(角色);
}
公共整数getId(){
返回id;
}
公共用户详细信息集合id(整数id){
this.id=id;
归还这个;
}
公共列表getRoles(){
返回角色;
}
公共用户详细信息设置角色(列出角色){
this.roles=角色;
归还这个;
}
}
然后按如下方式使用:

返回Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(jwtUser.getUsername())
.signWith(SignatureAlgorithm.HS512,编码保密)
.索赔(“用户详细信息”,新用户详细信息(1,“角色1”,“角色2”))
.compact();
它将产生以下有效载荷:

{
“jti”:“d65b83fd-fafb-4df4-9782-c4700c3c93ff”,
“sub”:“joe.doe”,
“用户详细信息”:{
“id”:1,
“角色”:[
“角色1”,
“角色2”
]
}
}

那么我如何向该编码添加其他信息。假设我需要通过添加其ID(如10012001)来添加角色?我可以添加一个对象而不是整数吗?像JSON?是的,我发现它更新了。我试试看。谢谢你的回复。