2010-01-29 2 views
1

J'ai un simple pojo nommé "Parent" qui contient une collection d'objet "Enfant". En hibernate/jpa, c'est simplement une association un-à-plusieurs, les enfants ne connaissent pas leur parent: ces objets enfants peuvent avoir différents types de parents donc il est plus facile de ne pas connaître le parent (pensez à Child qui représente les balises et les parents peuvent être différents types d'objets qui ont des étiquettes).Question de sécurité: comment sécuriser les collections Hibernate revenant du client au serveur?

Maintenant, j'envoie mon objet Parent à la vue client de mon site Web pour permettre à l'utilisateur de le modifier. Pour cela, j'utilise Hibernate/GWT/Gilead.

Mon utilisateur fait quelques modifications et cliquez sur le bouton de sauvegarde (ajax) qui envoie mon objet parent au serveur. les champs de mon parent ont été modifiés mais plus important, certains objets enfants ont été ajoutés ou supprimés dans la collection.

Pour résumé, lorsque l'objet parent revient au serveur, il a maintenant dans sa collection: - nouveaux objets « enfants » où id est nul et doit être persister - modification des objets « enfants » où id est non nul et doivent être fusionner - potentiellement piraté objets « enfants » où id est non nul, mais ne sont pas détenus à l'origine par la société mère - objets d'enfants disparus (supprimé): il faut supprimer

Comment vous enregistrez l'objet parent (et sa collection)? chargez-vous la collection parent à partir de la base de données pour comparer chaque objet de la collection modifiée pour voir s'il n'y a pas d'objet piraté? Est-ce que vous effacez l'ancienne collection (pour supprimer orphelin) et re ajouter un nouveau enfant (mais il y a un enfant qui n'a pas été modifié)?

grâce

PS: désolé pour mon anglais, je l'espère vous comprendre le concept;)

Répondre

0

La meilleure solution que j'ai trouvé est de gérer un DTO, créé manuellement. Le DTO envoie uniquement les données nécessaires au client. Pour chaque champ que je veux définir en mode ReadOnly, je calcule une signature basée sur une clé secrète que j'envoie au client avec mon dto.

Quand mon DTO revient au serveur, je vérifie la signature pour être sûr que mes lus seuls les champs n'ont pas changé (recalcule la signature avec revenir les champs et la comparer à la signature à revenir avec DTO)

Cela me permet de spécifier des champs en lecture seule et de m'assurer que mes objets ne sont pas piratés.

1

Quelque chose dans votre pile doit fournir la logique dont vous parlez, et compte tenu de votre situation, il est probablement toi. Vous devrez obtenir l'état persistant actuel de l'objet en lisant depuis votre source de données afin de pouvoir faire la comparaison. Gardez à l'esprit que, si plusieurs actions légitimes peuvent mettre à jour simultanément votre objet parent et sa collection, vous devrez prendre soin de définir votre grain de transaction et la nature thread-safe de votre code. Ce n'est pas un simple problème et il peut y avoir des fonctionnalités qui peuvent aider, mais je dois encore trouver quelque chose qui a résolu cela pour toute mise en œuvre du monde réel que j'ai rencontré, surtout où j'ai une logique qui essayé de faire la distinction entre les données légitimes et "piratées".

Vous pouvez envisager de modifier votre architecture de sorte que le parent et les enfants soient conservés dans des actions distinctes. Cela peut ne pas être approprié dans votre cas, mais vous pourriez être en mesure d'avoir un grain de transaction plus fin en divisant les actions de persistance et de fournir une sécurité axée sur les enfants, ce qui rend votre problème de piratage un peu plus gérable.

Bonne chance. Je vous recommande de dessiner un organigramme détaillé de votre logique avant de faire trop de codage.

+0

Bonjour, merci pour votre réponse;) Toutes mes fonctions sont transactionnelles donc je n'ai pas le problème de corrompre ma base de données. Tout ce que vous avez dit est exactement ce que j'ai en tête;) Dans la majorité de mes cas, j'ai essayé de persister et de fusionner les enfants indépendamment de mes parents (ce qui est plus propre et plus facile à sécuriser, comme vous le dites) mais Dans certains cas, je ne peux pas (mon client ajoute un petit tag, mais je veux attendre qu'il sauve le parent entier, et ne pas enregistrer immédiatement le tag ...). Ceci est un problème difficile ... –

Questions connexes