J'ai récemment téléchargé Rhino.Security et j'essaye d'implémenter des permissions sur une entité. Depuis que j'aime Ninject (v2), je voudrais mettre en place un exemple simple pour commencer. Dans mon NinjectModule je suis lié le dépôt et les services:Rhino.Security et IEntityInformationExtractor
Bind<ISessionFactory>()
.ToProvider(new SessionFactoryProvider())
.InSingletonScope();
Bind<ISession>().ToProvider(new SessionProvider())
.InSingletonScope();
Bind<IAuthorizationRepository>()
.To<AuthorizationRepository>()
.InSingletonScope();
Bind<IPermissionsService>()
.To<PermissionsService>()
.InSingletonScope();
Bind<IAuthorizationService>()
.To<AuthorizationService>()
.InSingletonScope();
Bind<IPermissionsBuilderService>()
.To<PermissionsBuilderService>()
.InSingletonScope();
Je teste tout dans une application console et tout fonctionne bien. Je peux exécuter ce test sans problème:
public void RunTest()
{
Model.User user1;
Rhino.Security.Model.UsersGroup grp1;
using (session)
{
session.BeginTransaction();
user1 = new Model.User { Name = "xxx xxx" };
session.Save(user1);
session.Flush();
grp1 = authorizationRepository.CreateUsersGroup("Administrators");
session.Flush();
authorizationRepository.AssociateUserWith(user1, grp1);
session.Flush();
var OpAccountEdit = authorizationRepository.CreateOperation("/Account/Edit");
session.Flush();
permissionsBuilderService
.Allow(OpAccountEdit)
.For(grp1)
.OnEverything()
.Level(10)
.Save();
permissionsBuilderService
.Deny(OpAccountEdit)
.For(user1)
.OnEverything()
.Level(10)
.Save();
Console.WriteLine(authorizationService.IsAllowed(user1, "/Account/Edit"));
session.Transaction.Rollback();
Console.ReadLine();
}
}
Maintenant, je voudrais définir une autorisation pour un compte; quelque chose comme ceci:
account1 = new Model.Account() { Name = "My Account", SecurityKey = new Guid(), Id = 1 };
session.Save(account1);
session.Flush();
permissionsBuilderService
.Allow("/Account/Delete")
.For(user1)
.On(account1)
.Level(20)
.Save();
J'ai défini ma classe, comme Ayende a fait dans l'exemple de code trouvé dans la solution:
public class AccountInfromationExtractor : IEntityInformationExtractor<Model.Account>
{
...
}
et j'ai essayé de lier (dans mon module ninject) l'IEntityInformationExtractor d'interface à la classe
Bind<IEntityInformationExtractor<Model.Account>>()
.To<AccountInfromationExtractor>();
mais quand je lance mon application, je reçois un « référence d'objet non définie à une instance d'un objet. » dans la classe de sécurité. Le localisateur de service ne peut pas résoudre l'instance et il génère et exception ici:
var extractor = ServiceLocator.Current.GetInstance<IEntityInformationExtractor<TEntity>>();
Est-ce qu'il ya quelqu'un qui a essayé d'utiliser Ninject avec Rhino.Security et serait en mesure de me aider?
Merci