package com.dji.sample.common.model; import com.auth0.jwt.interfaces.Claim; import com.fasterxml.jackson.annotation.JsonAlias; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Field; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * A custom claim for storing custom information in the token. * @author sean.zhou * @date 2021/11/16 * @version 0.1 */ @AllArgsConstructor @NoArgsConstructor @Data @Slf4j public class CustomClaim { /** * The id of the account. */ private String id; private String username; @JsonAlias("user_type") private Integer userType; @JsonAlias("workspace_id") private String workspaceId; /** * Convert the custom claim data type to the Map type. * @return map */ public ConcurrentHashMap convertToMap() { ConcurrentHashMap map = new ConcurrentHashMap<>(4); try { Field[] declaredFields = this.getClass().getDeclaredFields(); for (Field field : declaredFields) { JsonAlias annotation = field.getAnnotation(JsonAlias.class); field.setAccessible(true); // The value of key is named underscore. map.put(annotation != null ? annotation.value()[0] : field.getName(), field.get(this).toString()); } } catch (IllegalAccessException e) { log.info("CustomClaim converts failed. {}", this.toString()); e.printStackTrace(); } return map; } /** * Convert the data in Map into a custom claim object. * @param claimMap */ public CustomClaim (Map claimMap) { Field[] declaredFields = this.getClass().getDeclaredFields(); for (Field field : declaredFields) { field.setAccessible(true); JsonAlias annotation = field.getAnnotation(JsonAlias.class); Claim value = claimMap.get(annotation == null ? field.getName() : annotation.value()[0]); try { Class type = field.getType(); if (Integer.class.equals(type)) { field.set(this, Integer.valueOf(value.asString())); continue; } if (String.class.equals(type)) { field.set(this, value.asString()); continue; } } catch (IllegalAccessException e) { log.info("Claim parses failed. {}", claimMap.toString()); e.printStackTrace(); } } } }