【发布时间】:2020-09-15 23:57:27
【问题描述】:
我有一个方法尝试从 Jwt 令牌中提取信息以实例化 UserDetails 实例。该方法如下所示:
public UserDetails loadUserByAuthToken(String authToken){
Claims claims = getClaimsFromToken(authToken);
return JwtUserFactory.create(
claims.get(CLAIM_KEY_USER_ID, Long.class),
....
Collection<? extends GrantedAuthority>claims.get(CLAIM_KEY_GRANTED_AUTHORITIES, Collection.class),
);
尽管将列表值从 CLAIM_KEY_GRANTED_AUTHORITIES 显式转换为 (List<GrantedAuthority>),但它仍会将列表转换为链接的哈希图。
我在这里读到,当类型未定义时,Jackson 会自动将列表转换为链接的哈希图。 Resteasy converting List to LinkedHashMap 该线程是关于resteasy的,但我认为我的代码中正在发生同样的事情。 在这个线程Class cast exception in JWT 中,我读到 Jackson 在从 jwt 令牌中提取数据时也用于确定数据类型。
关键是我声明了一个类型,即List.class。这是我可以给出的具体内容,因为List<GrantedAuthority>.class 会导致编译错误。当我在控制台中记录列表的内容时,它看起来像这样:
[{authority=ROLE_USER}, {authority=ROLE_ADMIN}]
如何防止 Jackson 将 GrantedAuthorityList 隐式转换为 LinkedHashMap 列表并避免类转换异常?
我使用的是 jjwt 版本 0.9.0
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
谢谢
编辑:继承 getClaimsFromToken 方法
public Claims getClaimsFromToken(String token) {
Claims claims;
try {
claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
e.printStackTrace();
claims = null;
}
return claims;
}
【问题讨论】: