Skip to content

Commit c912bac

Browse files
committed
Add support for context Subject
1 parent fd1d34e commit c912bac

File tree

3 files changed

+39
-19
lines changed

3 files changed

+39
-19
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version = 0.4.4
1+
version = 0.5.0

src/main/java/graphql/servlet/GraphQLContext.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,22 @@
1414
*/
1515
package graphql.servlet;
1616

17-
import lombok.AllArgsConstructor;
1817
import lombok.Getter;
18+
import lombok.NonNull;
19+
import lombok.RequiredArgsConstructor;
1920
import lombok.Setter;
2021

22+
import javax.security.auth.Subject;
2123
import javax.servlet.http.HttpServletRequest;
2224
import javax.servlet.http.HttpServletResponse;
2325
import java.util.Optional;
2426

25-
@AllArgsConstructor
27+
@RequiredArgsConstructor
2628
public class GraphQLContext {
27-
@Getter @Setter
29+
@Getter @Setter @NonNull
2830
private Optional<HttpServletRequest> request;
29-
@Getter @Setter
31+
@Getter @Setter @NonNull
3032
private Optional<HttpServletResponse> response;
33+
@Getter @Setter
34+
private Optional<Subject> subject = Optional.empty();
3135
}

src/main/java/graphql/servlet/GraphQLServlet.java

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,18 @@
3131
import org.osgi.service.component.annotations.ReferenceCardinality;
3232
import org.osgi.service.component.annotations.ReferencePolicy;
3333

34+
import javax.security.auth.Subject;
3435
import javax.servlet.Servlet;
3536
import javax.servlet.ServletException;
3637
import javax.servlet.http.HttpServlet;
3738
import javax.servlet.http.HttpServletRequest;
3839
import javax.servlet.http.HttpServletResponse;
3940
import java.io.IOException;
4041
import java.io.InputStreamReader;
42+
import java.security.AccessController;
43+
import java.security.PrivilegedAction;
44+
import java.security.PrivilegedActionException;
45+
import java.security.PrivilegedExceptionAction;
4146
import java.util.*;
4247
import java.util.stream.Collectors;
4348

@@ -165,23 +170,34 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws S
165170
}
166171

167172
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+
});
174182
} 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()));
178193

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);
183198

184-
resp.getWriter().write(new ObjectMapper().writeValueAsString(dict));
199+
resp.getWriter().write(new ObjectMapper().writeValueAsString(dict));
200+
}
185201
}
186202
}
187203

0 commit comments

Comments
 (0)