2008-08-29 38 views
6

Le système sur lequel je travaille actuellement nécessite une certaine sécurité basée sur les rôles, qui est bien prise en compte dans la pile Java EE. Le système a l'intention d'être un cadre pour les experts du domaine des affaires à écrire leur code sur le dessus. Cependant, les données security sont également requises. C'est-à-dire quelles informations sont visibles pour un utilisateur final.data 'security' avec java et hibernate

Cela signifie en réduisant la visibilité à des lignes et des colonnes (peut-être même) dans la base de données.

Nous utilisons Hibernate pour notre persistance. Cependant, nous utilisons nos propres annotations afin de ne pas exposer notre choix de persistance aux experts du domaine métier.

Pour la sécurité basée sur les lignes, cela signifie que nous pourrions ajouter une annotation telle que @Secured au niveau de l'entité, ce qui entraînerait l'ajout d'une colonne supplémentaire à la table sous-jacente pour contraindre nos sélections?

Pour la sécurité basée sur les colonnes, nous pourrions avoir @Secured pour aider à la génération de requêtes, ou peut-être utiliser un aspect pour filtrer les informations retournées?

Je suis curieux de savoir comment cela pourrait aussi affecter les mécanismes de mise en cache d'hibernate?

Je suis sûr que beaucoup d'autres auront eu le même problème, et je me demandais comment vous avez abordé cela?

Très apprécié ...

Répondre

6

Hibernate a filter mechanism qui peut travailler pour vous. Les filtres réécrireont les requêtes générées par hibernate pour inclure une clause supplémentaire pour limiter les lignes retournées. Je ne suis pas au courant de quoi que ce soit en hibernation pour masquer/cacher les colonnes.

Votre base de données peut également avoir un support pour cette fonctionnalité. Oracle, par exemple, a le Virtual Private Database (VPD) qui réécrire vos requêtes au niveau de la base de données. Cette solution présente l'avantage supplémentaire que tout programme externe (par exemple, les outils de création de rapports) qui va à l'encontre de votre base de données verra vos restrictions de sécurité appliquées. VPD a également la possibilité de masquer des colonnes restreintes avec des valeurs NULL.

Malheureusement, les solutions ci-dessus n'ont pas été suffisantes pour prendre en charge les exigences de sécurité pour les types de projets sur lesquels je travaille habituellement. Il existe généralement un type de contexte qui ne peut pas être facilement exprimé dans les solutions ci-dessus. Par exemple, les utilisateurs peuvent visualiser les données qu'ils ont créées ou qui ont été été marquées comme public, ou appartiennent à un projet qu'ils gèrent.

Nous créons généralement des objets query/finder/DAO dans lesquels nous transmettons les valeurs requises pour appliquer la sécurité, puis créons la requête en conséquence.

J'espère que cette aide

1

Lorsque vous utilisez des filtres Hibernate, vous devez savoir que les restrictions supplémentaires ne seront pas appliquées aux instructions SQL generted par les load() ou get() méthodes.