2010-11-23 637 views
2

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

Répondre

1

A la fin, je ne pouvais pas réussi à le faire fonctionner avec Ninject donc je suis passé à StructureMap.
Rhino.Security fonctionne avec MS ServiceLocator pour résoudre IEntityInformationExtractor. J'ai trouvé un adaptateur ServiceLocator pour StructureMap

Je l'ai mentionné dans mon projet, les ensembles suivants:

Microsoft.Practices.ServiceLocation
StructureMap
StructureMapAdapter

a changé mon code pour utiliser StructureMap:

public static class Bootstrapper 
    { 
     public static void Initialize() 
     { 
      ObjectFactory.Initialize(cfg => 
      { 
       cfg.AddRegistry<StructureMapRegistry>(); 
      }); 
      ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container)); 
     } 
    } 

et ma StructureMap Classe de registre:

public class StructureMapRegistry : Registry 
{ 
    public StructureMapRegistry() 
    { 
     string ConnDb = "Data Source=(local); Initial Catalog=RhinoSecurity_Test; Trusted_Connection=true;"; 

     For<ISessionFactory>() 
      .Singleton() 
      .TheDefault.Is.ConstructedBy(() => new NHSessionFactory(ConnDb, false).SessionFactory); 
     For<ISession>() 
      .Singleton() 
      .TheDefault.Is.ConstructedBy(x => x.GetInstance<ISessionFactory>().OpenSession()); 
     For<IAuthorizationRepository>() 
      .Use<AuthorizationRepository>(); 
     For<IPermissionsService>() 
      .Use<PermissionsService>(); 
     For<IAuthorizationService>() 
      .Use<AuthorizationService>(); 
     For<IPermissionsBuilderService>() 
      .Use<PermissionsBuilderService>(); 
     For<IEntityInformationExtractor<Model.Account>>() 
      .Use(p => 
       { 
       return (new AccountInfromationExtractor(p.GetInstance<ISession>())); 
       }); 
    } 
} 

J'espère que cela pourrait aider quelqu'un.