|
31 | 31 | import org.osgi.service.component.annotations.ReferenceCardinality; |
32 | 32 | import org.osgi.service.component.annotations.ReferencePolicy; |
33 | 33 |
|
| 34 | +import javax.security.auth.Subject; |
34 | 35 | import javax.servlet.Servlet; |
35 | 36 | import javax.servlet.ServletException; |
36 | 37 | import javax.servlet.http.HttpServlet; |
37 | 38 | import javax.servlet.http.HttpServletRequest; |
38 | 39 | import javax.servlet.http.HttpServletResponse; |
39 | 40 | import java.io.IOException; |
40 | 41 | import java.io.InputStreamReader; |
| 42 | +import java.security.AccessController; |
| 43 | +import java.security.PrivilegedAction; |
| 44 | +import java.security.PrivilegedActionException; |
| 45 | +import java.security.PrivilegedExceptionAction; |
41 | 46 | import java.util.*; |
42 | 47 | import java.util.stream.Collectors; |
43 | 48 |
|
@@ -165,23 +170,34 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S |
165 | 170 | } |
166 | 171 |
|
167 | 172 | private void query(String query, Map<String, Object> variables, GraphQLSchema schema, HttpServletRequest req, HttpServletResponse resp) throws IOException { |
168 | | - ExecutionResult result = new GraphQL(schema, new EnhancedExecutionStrategy()).execute(query, createContext(Optional.of(req), Optional.of(resp)), variables); |
169 | | - resp.setContentType("application/json"); |
170 | | - if (result.getErrors().isEmpty()) { |
171 | | - Map<String, Object> dict = new HashMap<>(); |
172 | | - dict.put("data", result.getData()); |
173 | | - resp.getWriter().write(new ObjectMapper().writeValueAsString(dict)); |
| 173 | + GraphQLContext context = createContext(Optional.of(req), Optional.of(resp)); |
| 174 | + if (Subject.getSubject(AccessController.getContext()) == null && context.getSubject().isPresent()) { |
| 175 | + Subject.doAs(context.getSubject().get(), new PrivilegedAction<Void>() { |
| 176 | + @Override @SneakyThrows |
| 177 | + public Void run() { |
| 178 | + query(query, variables, schema, req, resp); |
| 179 | + return null; |
| 180 | + } |
| 181 | + }); |
174 | 182 | } else { |
175 | | - result.getErrors().stream(). |
176 | | - filter(error -> (error instanceof ExceptionWhileDataFetching)). |
177 | | - forEachOrdered(err -> log.error("{}", ((ExceptionWhileDataFetching)err).getException())); |
| 183 | + ExecutionResult result = new GraphQL(schema, new EnhancedExecutionStrategy()).execute(query, context, variables); |
| 184 | + resp.setContentType("application/json"); |
| 185 | + if (result.getErrors().isEmpty()) { |
| 186 | + Map<String, Object> dict = new HashMap<>(); |
| 187 | + dict.put("data", result.getData()); |
| 188 | + resp.getWriter().write(new ObjectMapper().writeValueAsString(dict)); |
| 189 | + } else { |
| 190 | + result.getErrors().stream(). |
| 191 | + filter(error -> (error instanceof ExceptionWhileDataFetching)). |
| 192 | + forEachOrdered(err -> log.error("{}", ((ExceptionWhileDataFetching) err).getException())); |
178 | 193 |
|
179 | | - resp.setStatus(500); |
180 | | - List<GraphQLError> errors = getGraphQLErrors(result); |
181 | | - Map<String, Object> dict = new HashMap<>(); |
182 | | - dict.put("errors",errors); |
| 194 | + resp.setStatus(500); |
| 195 | + List<GraphQLError> errors = getGraphQLErrors(result); |
| 196 | + Map<String, Object> dict = new HashMap<>(); |
| 197 | + dict.put("errors", errors); |
183 | 198 |
|
184 | | - resp.getWriter().write(new ObjectMapper().writeValueAsString(dict)); |
| 199 | + resp.getWriter().write(new ObjectMapper().writeValueAsString(dict)); |
| 200 | + } |
185 | 201 | } |
186 | 202 | } |
187 | 203 |
|
|
0 commit comments