J'ai trop réfléchi à cela maintenant, sans solution évidente. Ce pourrait être une situation de bois pour les arbres, alors j'ai besoin de l'aide de stackoverflow. J'essaye d'imposer le filtrage de base de données sur une base régionale. Mon système a plusieurs utilisateurs et chacun est affecté à un bureau régional. Je veux seulement que les utilisateurs puissent voir les données associées à leur bureau régional.comment restreindre ou filtrer l'accès à la base de données en fonction des attributs de l'utilisateur de l'application
Mettez simplement mon application est: Java App -> JPA (veille prolongée) -> MySQL
La base de données contient l'objet de toutes les régions, mais je veux que les utilisateurs soient en mesure de manipuler des objets à partir de leur propre région. J'ai réfléchi aux manières suivantes de le faire:
1) modifier toutes les requêtes de base de données afin qu'elles lisent quelque chose comme select * de tablex où region = "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 aller natif, mais je dois seulement manquer une instruction select et ma sécurité est tirée
2) utiliser un proxy mysql pour filtrer les résultats. Un peu génial, mais alors le proxy mysql ne voit que l'appel brut et ne sait pas vraiment comment il devrait les filtrer (c'est-à-dire quelle région appartient à l'utilisateur qui a fait cette requête). Ok, je pourrais commencer un proxy pour chaque région, mais il commence à devenir un peu brouillon ..
3) utiliser des schémas séparés pour chaque région. oui, simple, j'utilise spring pour pouvoir utiliser le RoutingDataSource pour router les requêtes via la source de données correcte (1 datasource par schéma). Bien sûr, le problème est maintenant quelque part sur la ligne que je vais vouloir filtrer par région et par une autre catégorie. ohps.
4) ACL - pas vraiment sûr à ce sujet. Si a fait un select * de tablex; Est-ce qu'il filtrerait tranquillement les objets pour lesquels je n'ai pas accès ou est-ce qu'une charge d'exceptions d'accès serait levée? Mais est-ce que je réfléchis trop à ce sujet? Cela semble être un problème très commun. Il doit y avoir une solution facile que je suis trop bête pour voir. Je suis sûr que ce sera quelque chose près de/ou dans la base de données que vous voulez filtrer le plus près possible de la source, mais quoi?
Ne cherchez pas à être spoonfed - tous les liens, mots-clés, idées, suggestions de produits commerciaux/opensource seraient vraiment appréciés !! Merci.
Cela semble être une de ces situations où il peut avoir payé pour écrire votre propre DAL, mais je pense que c'est hors de question pour vous. Il semble que vous deviez les filtrer au niveau des entreprises. Bonne question, j'espère que quelqu'un ici trouvera une bonne réponse. –
Heureusement, j'ai un DAL très propre ... donC# 1 ressemble à la voie à suivre. Je voudrais juste être en mesure d'imposer l'utilisation de la DAL en tant que développeur dans le futur pourrait décider de le contourner –