Mr.*_*Eng 0 jwt spring-boot microservices
我正在尝试为我的微服务生成 JWT 令牌。该令牌将使用我的前端应用程序进行服务访问。在这里,我通过添加我的用户名来设置主题。我需要添加用户 ID 和用户名。下面的代码我用于通过仅添加主题“用户名”来生成令牌。
我的代码是,
protected String getToken(String encodedSecret, Users jwtUser){
return Jwts.builder()
.setId(UUID.randomUUID().toString())
.setSubject(jwtUser.getUsername())
.signWith(SignatureAlgorithm.HS512, encodedSecret)
.compact();
}
Run Code Online (Sandbox Code Playgroud)
这里我需要添加两个主题用户名和用户ID。我如何在这里添加两个主题?
您根本不能拥有两个或多个同名声明:
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();
Run Code Online (Sandbox Code Playgroud)
我可以添加一个对象而不是整数吗?像 JSON 一样?
是的,声明值可以是任意 JSON 值,但声明名称必须是字符串:
[...]
声明名称
声明表示的名称部分。声明名称始终是一个字符串。**声明值
声明表示的值部分。声明值可以是任何 JSON 值。[...]
JWT 将一组声明表示为以 JWS 和/或 JWE 结构编码的 JSON 对象。该 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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用如下:
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();
Run Code Online (Sandbox Code Playgroud)
它将产生以下有效负载:
{
"jti": "d65b83fd-fafb-4df4-9782-c4700c3c93ff",
"sub": "joe.doe",
"user-details": {
"id": 1,
"roles": [
"ROLE_1",
"ROLE_2"
]
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7222 次 |
| 最近记录: |