zuul spring-boot spring-cloud microservices gateway netflix-zuul

spring boot - Usando Zuul como una puerta de enlace de autenticación



zuul spring boot (3)

Agregue lo siguiente dentro de su método de ejecución, resolverá este problema

ctx.setSendZuulResponse(false); ctx.setResponseStatusCode(401);

Fondo

Quiero implementar el diseño presentado en este article .

Se puede resumir en el siguiente diagrama:

  1. El cliente primero se autentica con el IDP (OpenID Connect / OAuth2)
  2. El IDP devuelve un token de acceso (token opaco sin información de usuario)
  3. El cliente realiza una llamada a través de la puerta de enlace API, utiliza el token de acceso en el encabezado de autorización
  4. La puerta de enlace API realiza una solicitud al IDP con el token de acceso
  5. El IDP verifica que el token de acceso es válido y devuelve la información del usuario en formato JSON
  6. La puerta de enlace API almacena la información del usuario en un JWT y la firma con una clave privada. El JWT luego se pasa al servicio posterior que verifica el JWT utilizando la clave pública
  7. Si un servicio debe llamar a otro servicio para cumplir con la solicitud, pasa el JWT, que sirve como autenticación y autorización para la solicitud.

Lo que tengo hasta ahora

He hecho la mayor parte de eso usando:

  • La nube de primavera como marco global.
  • Bota de primavera para lanzar servicios individuales.
  • Netflix Zuul como la puerta de enlace API

También he escrito un filtro Zuul PRE que comprueba si hay un token de acceso, se pone en contacto con el IDP y crea un JWT. El JWT luego se agrega al encabezado de la solicitud reenviada al servicio posterior.

Problema

Ahora mi pregunta es bastante específica para Zuul y sus filtros. Si la autenticación falla en la puerta de enlace API por algún motivo, ¿cómo puedo detener el enrutamiento y responder directamente con un 401 sin continuar la cadena de filtros y reenviar la llamada?

En este momento, si la autenticación falla, el filtro no agregará el JWT al encabezado y el 401 provendrá del servicio posterior. Esperaba que mi puerta de enlace pudiera evitar esta llamada innecesaria.

Traté de ver cómo podría usar com.netflix.zuul.context.RequestContext para hacer esto, pero la documentación es bastante deficiente y no pude encontrar una manera.


Puede intentar configurar setSendZuulResponse(false) en el contexto actual. Esto no debe encaminar la solicitud. También puede llamar a removeRouteHost() desde el contexto, lo que lograría lo mismo. Podría usar setResponseStatusCode para configurar el código de estado 401.


Sé que llego muy tarde para responder. Puedes acercarte con el prefiltro de zuul. Los pasos que tienes que seguir se dan a continuación.

//1. create filter with type pre //2. Set the order of filter to greater than 5 because we need to run our filter after preDecoration filter of zuul. @Component public class CustomPreZuulFilter extends ZuulFilter { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Override public Object run() { final RequestContext requestContext = RequestContext.getCurrentContext(); logger.info("in zuul filter " + requestContext.getRequest().getRequestURI()); byte[] encoded; try { encoded = Base64.encode("fooClientIdPassword:secret".getBytes("UTF-8")); requestContext.addZuulRequestHeader("Authorization", "Basic " + new String(encoded)); final HttpServletRequest req = requestContext.getRequest(); if (requestContext.getRequest().getHeader("Authorization") == null && !req.getContextPath().contains("login")) { requestContext.unset(); requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); } else { //next logic } } } catch (final UnsupportedEncodingException e) { logger.error("Error occured in pre filter", e); } return null; } @Override public boolean shouldFilter() { return true; } @Override public int filterOrder() { return 6; } @Override public String filterType() { return "pre"; } }

requestContext.unset () restablecerá el RequestContext para la solicitud activa de los hilos actuales. y usted puede proporcionar un código de estado de respuesta.