Disons que j'ai trois types d'utilisateurs sur une application bloggingComment un service d'autorisation met en œuvre des contrôles de propriété dans une architecture Microservice basée sur les rôles
- Auteur (est capable de modifier leurs propres messages mais pas d'autres)
- administrateur (est capable de modifier tous les messages)
- lecteur (ne peut pas modifier les messages)
Pour gérer ce système que je veux avoir trois services principaux:
- Une API passerelle qui expose toutes les API clients consommeront, composer des services selon les besoins.
- Un de gestion après qui fournit les opérations CRUD pour les blogs (y compris les données de qui possède quoi les messages)
- Un service d'autorisation qui stocke des rôles et autorisations, ce qui expose une API qui prend dans un tableau de rôles (les rôles d'un utilisateur demandeur) et un tableau d'autorisations (les autorisations nécessaires pour accéder à une API) et détermine si ces rôles en entrée couvrent toutes les autorisations entrées.
Maintenant, ce que je suis aux prises avec est la propriété d'une ressource (et où la propriété doit être vérifiée). Sans communiquer avec d'autres services, comment un service d'autorisation peut-il déterminer si un utilisateur doit pouvoir accéder à quelque chose qu'il possède sans savoir comment déterminer si un utilisateur possède une ressource donnée?
Je suis venu avec quelques solutions différentes à ce problème, bien que je ne suis pas très content de l'un d'eux.
- La passerelle API interrogerait un autre service qui gère les messages pour déterminer si un utilisateur demandeur est propriétaire du poste qu'ils tentent d'accéder, cela signifierait il est logique d'autorisation qui se passe en dehors du service d'autorisation. Le service de gestion des articles de blog gérerait l'autorisation basée sur la propriété, cela signifierait aussi que la logique d'autorisation se passe en dehors du service d'autorisation ainsi que le fait que les demandes non autorisées soient marquées comme autorisées initialement (puisqu'elles passeront toujours par l'autorisation service)
- Le service d'autorisation pourrait être donné la connaissance de la façon de vérifier la propriété, l'API devrait pouvoir être dit si oui ou non il devrait vérifier la propriété avec les autorisations. Cela ajouterait de la complexité au service d'autorisation et augmenterait la communication inter-services que je voudrais reléguer le plus possible à la passerelle d'API puisqu'elle devrait être le compositeur de service primaire.
Vous cherchez des idées sur d'autres méthodes ou un aperçu de ce que pourrait être la meilleure solution à ce problème.
Je me suis penché sur votre première suggestion, ce que j'ai mis en œuvre est de permettre au service d'autorisation de prendre dans un tableau de tableaux de permission (ensembles de permission alternatifs autorisés à accéder à un itinéraire entre admin/author) et une "méta-permission" que les utilisateurs normaux n'auraient normalement pas comme indicateur pour la passerelle API de vérifier si l'utilisateur demandeur possède la ressource et s'ils le font, "mettrait" la méta permission avant la le service d'autorisation reçoit une demande (autorisant effectivement l'autorisateur à rejeter/accepter une demande basée sur la propriété sans rien savoir) –