View Javadoc
1   /*
2    * Copyright 2020 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.bremersee.spring.security.oauth2.server.resource.authentication;
18  
19  import com.jayway.jsonpath.DocumentContext;
20  import com.jayway.jsonpath.JsonPath;
21  import com.jayway.jsonpath.Option;
22  import net.minidev.json.JSONValue;
23  import org.springframework.security.oauth2.jwt.Jwt;
24  import org.springframework.util.ObjectUtils;
25  
26  /**
27   * The json path jwt parser.
28   *
29   * @author Christian Bremer
30   */
31  public class JsonPathJwtParser {
32  
33    private static final com.jayway.jsonpath.Configuration jsonPathConf
34        = com.jayway.jsonpath.Configuration.builder().options(Option.SUPPRESS_EXCEPTIONS).build();
35  
36    private final DocumentContext documentContext;
37  
38    /**
39     * Instantiates a new json path jwt parser.
40     *
41     * @param jwt the jwt
42     */
43    JsonPathJwtParser(Jwt jwt) {
44      final String jsonStr = JSONValue.toJSONString(jwt.getClaims());
45      this.documentContext = JsonPath.parse(jsonStr, jsonPathConf);
46    }
47  
48    /**
49     * Read the value of the given json path.
50     *
51     * @param <T> the type of the result
52     * @param jsonPath the json path
53     * @param resultClass the result class
54     * @return the value of the json path
55     */
56    <T> T read(String jsonPath, Class<T> resultClass) {
57      if (ObjectUtils.isEmpty(jsonPath)) {
58        return null;
59      }
60      return documentContext.read(jsonPath, resultClass);
61    }
62  
63  }