您不能拥有两个或多个同名声明:
4. JWT Claims
JWT 声明集表示一个 JSON 对象,其成员是
JWT 传达的声明。 JWT 声明集中的声明名称
必须是唯一的; JWT 解析器必须要么拒绝重复的 JWT
声明名称或使用仅返回词法最后的 JSON 解析器
重复的成员名称 [...]
但是,您可以对用户 ID 使用其他声明:
return Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(jwtUser.getUsername())
.signWith(SignatureAlgorithm.HS512, encodedSecret)
.claim("user-id", "id goes here")
.compact();
我可以添加一个对象而不是一个整数吗?喜欢 JSON 吗?
是的,声明值可以是任意 JSON 值,但声明名称必须是字符串:
2. Terminology
[...]
声明名称
声明表示的名称部分。声明名称是
总是一个字符串。**
声明价值
声明表示的价值部分。索赔价值可以是
任何 JSON 值。
[...]
3. JSON Web Token (JWT) Overview
JWT 将一组声明表示为 JSON 对象,该对象被编码为
JWS 和/或 JWE 结构。此 JSON 对象是 JWT 声明集。
[...] JSON 对象包括
零个或多个名称/值对(或成员),其中名称是
字符串和值是任意 JSON 值。这些成员是
JWT 所代表的声明。 [...]
所以你可以定义一个类:
class UserDetails {
private Integer id;
private List<String> roles;
public UserDetails(Integer id, String... roles) {
this.id = id;
this.roles = Arrays.asList(roles);
}
public Integer getId() {
return id;
}
public UserDetails setId(Integer id) {
this.id = id;
return this;
}
public List<String> getRoles() {
return roles;
}
public UserDetails setRoles(List<String> roles) {
this.roles = roles;
return this;
}
}
然后按如下方式使用:
return Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(jwtUser.getUsername())
.signWith(SignatureAlgorithm.HS512, encodedSecret)
.claim("user-details", new UserDetails(1, "ROLE_1", "ROLE_2"))
.compact();
它将产生以下有效载荷:
{
"jti": "d65b83fd-fafb-4df4-9782-c4700c3c93ff",
"sub": "joe.doe",
"user-details": {
"id": 1,
"roles": [
"ROLE_1",
"ROLE_2"
]
}
}