Я попробовал пару разных фильтров и применил их к цепочке фильтров безопасности вот так..
Код: Выделить всё
.addFilterBefore(new IntrospectionQueryFilter(), usernamePasswordAuthenticationFilter.class)
Код: Выделить всё
public class IntrospectionQueryFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// No initialization needed
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
final var method = httpRequest.getMethod();
final var uri = httpRequest.getRequestURI();
if (isIntrospectionQuery(httpRequest)) {
chain.doFilter(request, response);
} else {
// Proceed to authentication
httpResponse.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
}
}
private boolean isIntrospectionQuery(HttpServletRequest request) throws IOException {
final var method = request.getMethod();
final var uri = request.getRequestURI();
if (uri.equals("/graphiql") || uri.equals("/favicon.ico")) {
return true;
}
if ("POST".equalsIgnoreCase(request.getMethod()) && "/graphql".equalsIgnoreCase(request.getRequestURI())) {
BufferedReader reader = request.getReader();
StringBuilder body = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
body.append(line);
}
return body.toString().contains("\"operationName\":\"IntrospectionQuery\"");
}
return false;
}
@Override
public void destroy() {
// No resources to clean up
}
}
Подробнее здесь: https://stackoverflow.com/questions/788 ... t-security