Entonces, creo que entiendo la lógica detrás de los estándares de autorización como OAuth. El token de OAuth contiene información sobre el usuario (nombre, rol, etc.), que puedo usar para proteger mi aplicación .
Es sobre la última parte de la oración anterior que tengo una pregunta. Digamos que tengo una aplicación web con 1000 artículos, ¿cómo verifico si un usuario específico (basado en su token de OAuth) tiene acceso a un artículo determinado o no? Veo varias opciones:
- Almaceno todos los ID de los artículos que el usuario puede ver en el token de OAuth (por ejemplo, ID1, ID2, ID3, etc.);
- A la inversa, también puedo almacenar qué usuarios pueden acceder al artículo (por ejemplo, los usuarios pueden leer el artículo 1, 1, 2, 3). Esto es como un ACL;
- Para cada artículo, almaceno qué roles pueden acceder a ese artículo (por ejemplo, el artículo 1 puede leerse por rol: lector). Esto es como RBAC;
- No asegure su contenido en absoluto, como Facebook parece hacer (aunque asegúrelo, pero solo revisan su lista de amigos antes de proporcionarle la url directa al recurso).
Para aclarar: no estoy buscando una respuesta que explique que puede colocar reclamaciones en el token en sí, para que no tenga que pulsar la db para recuperar sus reclamaciones (sin estado). Estoy buscando formas en que el back-end de la aplicación utiliza estas reclamaciones para decidir si se otorga o no el acceso a un determinado elemento de contenido.
- La opción 1 parece una mala práctica, ya que los tokens se volverán infinitamente grandes para los grandes proveedores.
- Si los proveedores grandes utilizan la opción 2 o 3, tendrán una gran cantidad de visitas a la base de datos (verifique si ese usuario puede acceder a ese artículo), lo que no puede ser bueno para el rendimiento. Este aumento de rendimiento es una de las razones por las que Facebook y Twitters utilizan la autorización sin estado, en lugar de la autorización con estado. Supongo que esta penalización de rendimiento en el nivel de contenido es un bloqueo contra el uso de la opción 2 o 3.
- Entonces, ¿es la única opción viable ir con 4?
Una última opción que veo es usar la opción 3, combinada con un gran almacenamiento en caché. Como los permisos de contenido no son tan efímeros como los derechos de usuario, esta es la opción que elegiría. Pero, ¿es así como lo hacen los grandes proveedores (Google, Twitter, Dropbox, etc.)? ¿Y cómo se implementa en la práctica?
Actualizar
Alguien me habló sobre Matriz de permisos de Spring que puede poner en la memoria, pero no estoy seguro de si este sería el camino a seguir ...