2017-10-10 2 views
0

J'ai la configuration suivante - le service Spring SAAS REST, qui permet à différentes entreprises de gérer différents événements. Et il y a aussi un client de repos (une application mobile), expédié séparément pour chaque entreprise. Je veux utiliser keycloak pour les questions de sécurité, et j'ai une question de savoir comment séparer une entreprise d'une autre.Séparer l'accès dans une application avec keycloak

J'ai besoin de companyA pour ne pas pouvoir accéder à l'événement companyB, et aussi avoir besoin de différents rôles au sein de l'entreprise - certains peuvent créer des événements, d'autres ne peuvent que les lire.

D'abord je pensais que chaque entreprise aura propre domaine créé en keycloak, mais j'appris que domaine effectivement spécifié dans les paramètres de service de démarrage du printemps REST comme

keycloak.realm = demo-royaume

Ce qui signifie qu'il ne s'agit que d'un domaine par application REST. Et je ne veux pas configurer l'instance de service REST par client. Je veux seulement qu'un REST les règle tous. Est-ce que j'essaie d'utiliser quelque chose qui ne correspond pas vraiment à mon cas d'utilisation?

Sera-t-il judicieux de configurer un groupe Keycloack pour chaque entreprise et de faire en sorte que les utilisateurs d'un groupe n'aient pas accès à ce qui est créé par un autre groupe. Mais alors cela semble vraiment mal, puisque je comprends groupe sont censés être utilisés d'une manière différente - d'avoir un groupe d'administration et un groupe d'utilisateurs, etc, la ségrégation des utilisateurs "verticalement" par "privilèges", et non "horizontalement".

Pouvez-vous suggérer une bonne approche pour ce problème?

Répondre

1

Je voudrais mettre en œuvre un mappeur de protocole personnalisé qui charge des autorisations utilisateur supplémentaires pour votre application et les stocke dans un jeton. De cette façon, vous utilisez un seul domaine et s'il y a plus d'entreprises à l'avenir, il évolue bien. Ici vous avez an example de la façon de l'implémenter.

Fondamentalement, le champ otherClaims du jeton d'accès est un champ JSON qui permet de définir une carte de propriétés. Vous pouvez ajouter un champ ici comme:

userAccessibleCompanyIds: [1,3,4]

Comment charger la société ids pour l'utilisateur concret? Vous pouvez accéder à votre base de données d'application à partir du mappeur ou les obtenir à l'aide de l'API REST.

Ensuite, dans votre application, vous devez avoir un contrôle sur ce que l'utilisateur accède. Ce que je fais est de décoder le jeton et de voir si la demande de l'utilisateur convient. Sinon, renvoyez une réponse 403.