tradeshark commented on issue #11603:
URL: https://github.com/apache/dubbo/issues/11603#issuecomment-2954467164

   我遇到的也是反序列化问题,通过 @lizf2014 说的自定义ObjectMapperCodecCustomer能解决序列化和反序列化问题:
   
   ```
   @Activate(
           onClass = {
                   SECURITY_CONTEXT_HOLDER_CLASS_NAME,
                   CORE_JACKSON_2_MODULE_CLASS_NAME,
                   OBJECT_MAPPER_CLASS_NAME
           })
   public class DubboJacksonCustomizer implements ObjectMapperCodecCustomer {
   
       @Override
       public void customize(ObjectMapperCodec objectMapperCodec) {
           objectMapperCodec.configureMapper(om -> {
               om.addMixIn(JwtAuthenticationToken.class, 
JwtAuthenticationTokenMixin.class);
           });
       }
   
   
       @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
       @JsonDeserialize(using = JwtAuthenticationTokenDeserializer.class)
       @JsonAutoDetect(
               fieldVisibility = JsonAutoDetect.Visibility.ANY,
               getterVisibility = JsonAutoDetect.Visibility.NONE,
               isGetterVisibility = JsonAutoDetect.Visibility.NONE)
       @JsonIgnoreProperties(ignoreUnknown = true)
       public abstract class JwtAuthenticationTokenMixin {}
   
   
       static class JwtAuthenticationTokenDeserializer extends 
JsonDeserializer<JwtAuthenticationToken> {
           public JwtAuthenticationTokenDeserializer() {
           }
           static final TypeReference<List<GrantedAuthority>> authoritiesRef = 
new TypeReference<List<GrantedAuthority>>() {
           };
           @Override
           public JwtAuthenticationToken deserialize(JsonParser parser, 
DeserializationContext context) throws
                                                                                
                        IOException {
               ObjectMapper mapper = (ObjectMapper) parser.getCodec();
               JsonNode root = mapper.readTree(parser);
               return deserialize(parser, mapper, root);
           }
   
           private JwtAuthenticationToken deserialize(JsonParser parser, 
ObjectMapper mapper, JsonNode root)
                   throws JsonParseException {
               JsonNode principal = JsonNodeUtils.findObjectNode(root, 
"principal");
               if (!Objects.isNull(principal)) {
                   String tokenValue = principal.get("tokenValue").textValue();
                   long issuedAt = principal.get("issuedAt").longValue();
                   long expiresAt = principal.get("expiresAt").longValue();
                   Map<String, Object> headers = JsonNodeUtils.findValue(
                           principal, "headers", 
JsonNodeUtils.STRING_OBJECT_MAP, mapper);
                   Map<String, Object> claims = new java.util.HashMap<>();
                   claims = mapper.convertValue(principal.get("claims"), 
Map.class);
                   org.springframework.security.oauth2.jwt.Jwt jwt =
                           new 
org.springframework.security.oauth2.jwt.Jwt(tokenValue, 
Instant.ofEpochMilli(issuedAt),
                                                                           
Instant.ofEpochMilli(expiresAt), headers,
                                                                           
claims);
                  
                   List<GrantedAuthority> authorities =
                           mapper.convertValue(root.get("authorities"), 
authoritiesRef);
                   JwtAuthenticationToken jwtAuthenticationToken = new 
JwtAuthenticationToken(jwt, authorities);
                   jwtAuthenticationToken.setAuthenticated(true);
                   jwtAuthenticationToken.setDetails(
                           mapper.convertValue(root.get("details"), 
WebAuthenticationDetails.class));
                   return jwtAuthenticationToken;
               }
               return null;
           }
       }
   
       public static class JsonNodeUtils {
   
           static final TypeReference<Set<String>> STRING_SET = new 
TypeReference<Set<String>>() {
           };
   
           static final TypeReference<Map<String, Object>> STRING_OBJECT_MAP = 
new TypeReference<Map<String, Object>>() {
           };
   
           static String findStringValue(JsonNode jsonNode, String fieldName) {
               if (jsonNode == null) {
                   return null;
               }
               JsonNode value = jsonNode.findValue(fieldName);
               return (value != null && value.isTextual()) ? value.asText() : 
null;
           }
   
           static <T> T findValue(JsonNode jsonNode, String fieldName, 
TypeReference<T> valueTypeReference,
                                  ObjectMapper mapper) {
               if (jsonNode == null) {
                   return null;
               }
               JsonNode value = jsonNode.findValue(fieldName);
               return (value != null && value.isContainerNode()) ? 
mapper.convertValue(value, valueTypeReference) : null;
           }
   
           static JsonNode findObjectNode(JsonNode jsonNode, String fieldName) {
               if (jsonNode == null) {
                   return null;
               }
               JsonNode value = jsonNode.findValue(fieldName);
               return (value != null && value.isObject()) ? value : null;
           }
   
       }
   
   }
   
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org
For additional commands, e-mail: notifications-h...@dubbo.apache.org

Reply via email to