Метод Jwts.builder (). SetClaims () преобразует список в список LinkedHashMaps - PullRequest
0 голосов
/ 28 мая 2020

У меня есть метод, который пытается извлечь информацию из токена 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>), он по-прежнему преобразует список в связанную хэш-карту.

Я читал здесь что, когда тип не определен, Джексон автоматически преобразует список в связанную хэш-карту. Resteasy преобразование List в LinkedHashMap Тема посвящена resteasy, но я думаю, что то же самое происходит в моем коде. В этом потоке Исключение приведения класса в JWT Я читал, что Джексон также используется для определения типов данных при извлечении данных из токена jwt.

Дело в том, что я объявляю тип , а именно List.class. Это как указано c, потому что List<GrantedAuthority>.class приводит к ошибке компиляции. Когда я записываю содержимое списка в консоль, оно выглядит так:

[{authority=ROLE_USER}, {authority=ROLE_ADMIN}]

Как я могу предотвратить неявное преобразование Джексоном GrantedAuthorityList в список LinkedHashMap и избежать класса исключение cast?

Я использую версию 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;
}

1 Ответ

0 голосов
/ 28 мая 2020

Что ж, проведя еще несколько исследований, я обнаружил, что в моем случае нет решения. Согласно Баелдунгу https://www.baeldung.com/jackson-collection-array Джексон преобразует списки настраиваемых объектов в списки LinkedHashMap. Есть способ обойти это, используя jackson ObjectMapper вместе с TypeReference, но это работает только тогда, когда у настраиваемого объекта есть конструктор без аргументов по умолчанию, которого у меня нет.

Итак, моя работа такова:

convertListOfLinkedHashMapsToSimpleGrantedAuthorityList(objectMapper.convertValue(claims.get(CLAIM_KEY_GRANTED_AUTHORITIES, ArrayList.class),
                        new TypeReference<List<LinkedHashMap<String, SimpleGrantedAuthority>>>() { }));

    private Set<? extends GrantedAuthority> convertListOfLinkedHashMapsToSimpleGrantedAuthorityList(List<LinkedHashMap<String, SimpleGrantedAuthority>> linkedHashMapList){
        return linkedHashMapList.stream().flatMap(linkedHashMap -> linkedHashMap.values().stream()).collect(Collectors.toSet());
    }

Надеюсь, это поможет кому-нибудь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...