example ejemplo basada autenticacion java spring spring-security oauth-2.0 rate-limiting

java - ejemplo - spring boot rest security jwt



¿Cómo implementar la limitación de velocidad basada en un token de cliente en Spring? (4)

Estoy desarrollando una API REST simple usando Spring 3 + Spring MVC. La autenticación se realizará a través de OAuth 2.0 o autenticación básica con un token de cliente utilizando Spring Security. Esto todavía está en debate. Todas las conexiones serán forzadas a través de una conexión SSL.

He estado buscando información sobre cómo implementar la limitación de velocidad, pero no parece que haya mucha información disponible. La implementación necesita ser distribuida, ya que funciona en múltiples servidores web.

Por ejemplo, si hay tres servidores api A, B, C y los clientes están limitados a 5 solicitudes por segundo, entonces un cliente que hace 6 solicitudes como tal encontrará la solicitud de C rechazada con un error.

A recieves 3 requests / B receives 2 requests | Executed in order, all requests from one client. C receives 1 request /

Debe funcionar en función de un token incluido en la solicitud , ya que un cliente puede realizar solicitudes en nombre de muchos usuarios, y cada usuario debe tener un límite de velocidad en lugar de la dirección IP del servidor.

La configuración será múltiples (2-5) servidores web detrás de un equilibrador de carga HAProxy. Hay un Cassandra respaldado, y se usa memcached. Los servidores web se ejecutarán en Jetty.

Una posible solución podría ser escribir un filtro personalizado de Spring Security que extraiga el token y verifique cuántas solicitudes se han realizado con él en los últimos X segundos. Esto nos permitiría hacer algunas cosas, como diferentes límites de velocidad para diferentes clientes.

¿Alguna sugerencia sobre cómo se puede hacer? ¿Existe una solución existente o tendré que escribir mi propia solución? No he hecho mucha infraestructura de sitios web antes.


Evitaría modificar el código de nivel de aplicación para cumplir con este requisito si es posible.

Eché un vistazo a la documentación de HAProxy LB, nada demasiado obvio allí, pero el requisito puede justificar una investigación completa de las ACL.

Al poner a HAProxy a un lado, una arquitectura posible es poner un servidor web Apache al frente y usar un plugin de Apache para hacer la limitación de velocidad. Las solicitudes que superan el límite se rechazan por adelantado y los servidores de aplicaciones en el nivel detrás de Apache se separan de las preocupaciones por el límite de velocidad haciéndolos más simples. También podría considerar servir contenido estático del servidor web.

Ver la respuesta a esta pregunta ¿Cómo puedo implementar la limitación de velocidad con Apache? (solicitudes por segundo)

Espero que esto ayude. Robar



Puede poner límites de velocidad en varios puntos del flujo (generalmente cuanto más alto mejor) y el enfoque general que tiene tiene mucho sentido. Una opción para la implementación es usar 3scale para hacerlo ( http://www.3scale.net ) - limita los índices, los análisis, las claves administradas, etc. y funciona con un complemento de código (el complemento de Java está aquí: https : //github.com/3scale/3scale_ws_api_for_java ) que empuja o poniendo algo como Varnish (http://www.varnish-cache.org) en la tubería y teniendo que aplicar límites de velocidad.


También estaba pensando en soluciones similares hace un par de días. Básicamente, prefiero la solución "central-controlled" para guardar el estado de la solicitud del cliente en el entorno distribuido.

En mi aplicación, uso un "session_id" para identificar el cliente de solicitud. Luego, cree un filtro de servlet o Spring HandlerInterceptorAdapter para filtrar la solicitud, luego verifique el "session_id" con el repositorio de datos centralmente controlado, que podría ser memcached, redis, cassandra o zookeeper.