2009-03-31 5 views
2

Je ne fais que commencer à jouer avec/apprendre NHibernate pour un projet personnel, et j'ai l'impression de ne pas "obtenir" quelque chose. J'ai l'habitude de faire fonctionner les applications comme ceci:NHIbernate et Security/Business Layer

Couche de présentation -> Couche métier -> Couche de persistance. Par exemple, ma couche de présentation appelle BusinessLayer.GetCustomer (id). Dans cette méthode, je vérifierais que l'appelant a le droit d'aller chercher le client. OK, cela fonctionne toujours très bien avec NHibernate. Ma question est: comment puis-je sécuriser les mises à jour, les ajouts et les suppressions? Par exemple, Supposons que je souhaite modifier le client que j'ai récupéré. Normalement, je l'ai fait:

customer.FirstName ="Mike"; 
BusinessLayer.UpdateCustomer(customer); 

Encore une fois, la méthode UpdateCustomer vérifierait que vous pouvez mettre à jour ce client. OK, mais avec NHibernate, pour mettre à jour le client, je vais simplement définir le FirstName. Je n'ai donc pas besoin d'appeler Update car tout est transparent. C'est le point d'Hibernate à droite: "Persistance transparente et automatisée". Alors, comment puis-je avoir mes contrôles de sécurité en place avec cette transparence? Simplement, je ne me fais pas confiance assez pour ne pas faire une erreur et faire quelque chose comme:

List<string> customerNames = new List<string>(); 
foreach (Customer c in GetCustomersThatLikeStuffThatILike()) { 
    string custName=""; 
    c.CustomerName = custname; //Oops. I meant to say: custname = c.CustomerName; 
    customerNames.Add(custName); 
} 

Oops. Je viens d'effacer tous les noms des clients dans la base de données. Est-ce artificiel? Oui. Maintenant, si j'avais une sorte de vérification de BusinessLayer en place, cela lèverait juste une exception car cet utilisateur ne peut pas mettre à jour les noms des autres utilisateurs.

Un autre problème. Je suis suppose admin et peut vraiment faire quoi que ce soit dans le système et je code comme ceci:

//Display a customers orders that haven't shipped yet: 
var Orders = Customer.Orders; 
Orders.RemoveAll(order => order.HasNotShipped); 
Grid.DataSource = Orders; 
Grid.DataBind(); 

OK, donc ici, je voulais juste filtrer les commandes, mais je accidentellement fini de les supprimer de la base de données . La transparence m'a fait faire quelque chose de très mauvais. Comment peut-on atténuer ce risque?

J'ai vraiment envie utiliser NHibernate mais je ne le font pas veulent le faire dans le mauvais sens. Aidez-moi! :)

Répondre

0

Pour votre sécurité, consultez le NHibernate Inteceptor documentation. Les intercepteurs vous permettent de vous connecter au cycle de vie de la session et d'activer la fonctionnalité que vous recherchez.

Le deuxième problème est la raison pour laquelle vous créez des référentiels et n'exposez que les fonctionnalités dont vous avez besoin. Si une application n'a pas besoin de la fonction RemoveAll (et la plupart n'en ont pas), ne l'exposez pas.

+0

J'ai vu la substance d'intercepteur. Je suppose que j'étais curieux de savoir si c'est ce que les autres développeurs utilisent. En ce qui me concerne, je me méprends peut-être. Dans mon exemple, Orders est simplement renvoyé un IList. Si vous supprimez des choses de ce IList ne sont-ils pas supprimés de la base de données? – aquinas

+0

Cela dépend de la manière dont vous gérez votre session. Si la couche de votre référentiel renvoie tous les enregistrements et ferme ensuite la session, la suppression de la liste n'a aucun effet sur la base de données. Votre référentiel fournirait alors des méthodes pour la suppression des données. – DoniG