comment restreindre ou filtrer l'accès à la base de données en fonction des attributs de l'utilisateur de l'application

StackOverflow https://stackoverflow.com/questions/433707

Question

J'y ai trop réfléchi maintenant sans solution évidente. C’est peut-être une véritable affaire de bois pour l’arbre, alors j’ai besoin de l’aide de stackoverflow.

J'essaie d'appliquer le filtrage de la base de données sur une base régionale. Mon système a plusieurs utilisateurs et chacun est attribué à un bureau régional. Je veux seulement que les utilisateurs puissent voir les données associées à leur bureau régional.

En termes simples, mon application est: Application Java - > JPA (hibernation) - > MySQL

La base de données contient des objets de toutes les régions, mais je veux seulement que les utilisateurs puissent manipuler des objets de leur propre région. J'ai réfléchi aux manières de le faire suivantes:

1) modifiez toutes les requêtes de base de données pour qu'elles lisent quelque chose comme select * from tablex où region = "quot myregion". C'est méchant. Cela ne fonctionne pas bien avec JPA, par exemple, la méthode entitymanager.find () n'accepte que la clé primaire. Bien sûr, je peux devenir natif, mais il ne me manque qu'une déclaration et la sécurité est déclenchée

2) utilisez un proxy mysql pour filtrer les résultats. C'est un peu génial, mais le proxy mysql ne voit que l'appel brut et ne sait pas vraiment comment il doit les filtrer (c'est-à-dire à quelle région appartient l'utilisateur qui a fait cette demande). Ok, je pourrais créer un proxy pour chaque région, mais ça commence à être un peu brouillon.

3) utilisez des schémas distincts pour chaque région. oui, c'est simple, j'utilise spring pour pouvoir utiliser RoutingDataSource pour acheminer les requêtes via la source de données appropriée (1 source de données par schéma). Bien sûr, le problème est maintenant quelque part sur la ligne que je vais filtrer par région et par une autre catégorie. ohps.

4) ACL - pas vraiment sûr de ça. Si a fait un select * from tablex; filtrerait-il discrètement les objets auxquels je n’ai pas accès ou une charge d’exceptions d’accès serait-elle lancée?

Mais est-ce que je pense trop à cela? Cela semble être un problème très commun. Il doit y avoir une solution facile, je suis trop bête à voir. Je suis sûr que ce sera quelque chose de proche de / ou dans la base de données car vous voulez filtrer le plus près possible de la source, mais quoi?

Je ne cherche pas à être traité à la cuillère - des liens, mots clés, idées, suggestions de produits commerciaux / opensource seraient vraiment appréciés !! merci.

Était-ce utile?

La solution

Je viens d'implémenter quelque chose de similaire (REALbasic conversation avec MySQL) au cours des dernières semaines pour une extension hiérarchique multi-sociétés à un logiciel de comptabilité.

Un grand nombre de codes existants composent les instructions SQL. Nous avons donc dû en tenir compte et procéder à de nombreux audits pour nous assurer que les restrictions étaient incluses dans chaque tableau, le cas échéant. Un des pièges consistait en recherches associées , les tables de consultation n'étant généralement utilisées qu'avec une table primaire, mais pour certaines interfaces de maintenance, la table de recherche elle-même serait chargée directement.

Il existe un danger de donner des informations implicites telles que révéler qu'Acme Pornstars est un client d’une division de la société ;-)

La seule solution pour cette partie était une construction très minutieuse des diagrammes de base de données pour montrer toutes les relations implicites et de nombreux codes d’audit et de grepping, avec des commentaires soigneux pour indiquer que les zones qui n’avaient pas été utilisées n’avaient pas besoin de restrictions supplémentaires.

Le seul motif que j'ai mis au point pour rendre ceci plus généralisé à l'avenir est, plutôt que des recherches de type région = currentRegionVar explicites, en utilisant un entityID arbitraire fourni par une fonction globale CurrentEntityForRole ("blah"). <

Cette abstraction permet de partager certaines données et d'implémenter des pseudo-entités représentant d'autres limites de restriction.

Je ne connais pas suffisamment Java et Spring pour pouvoir le savoir, mais y a-t-il un moyen d'utiliser des vues pour fournir une recherche à clé unique, où les vues sont restreintes par le filtre de région?

La volonté de fournir des agrégations et un partage possible des données était la raison pour laquelle nous n’avons pas choisi la base de données séparée.

Autres conseils

Bonne question.

On dirait que le n ° 1 est le meilleur puisqu'il est le plus flexible.

La région est ce que vous filtrez aujourd'hui, mais ce pourrait être région + département + couleur de cheveux demain.

Si vous commencez trop à scinder les données, vous aurez l'impression de devoir travailler plus que nécessaire pour les recoller pour les signaler.

J'ai le même problème. Il est difficile de croire qu’une tâche aussi commune (filtrer une liste d’entités modèles en fonction du profil de l’utilisateur) n’ait pas de méthode ni de modèle «standard», ni de bonne pratique.

J'ai trouvé un pgacl , un module PostgreSQL. Fondamentalement, vous faites votre requête comme vous le feriez normalement, puis vous fixez un prédicat acl_access () pour qu’il fonctionne en tant que filtre.

Peut-être y a-t-il quelque chose de similaire pour MySQL.

Je vous suggère d'utiliser ACL. C'est plus flexible que les autres choix. Utilisez la sécurité de printemps. Vous pouvez l'utiliser sans utiliser Spring Framework. Lisez le didacticiel sur le texte du lien .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top