Rhino.Security и IEntityInformationExtractor
Я недавно скачал Rhino.Security и пытаюсь реализовать разрешения для объекта. Поскольку мне нравится Ninject (v2), я бы хотел начать с простого примера. В моем NinjectModule я связал хранилище и сервисы:
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();
Я тестирую все в консольном приложении, и все работает нормально. Я могу запустить этот тест без проблем:
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();
}
}
Теперь я хотел бы определить разрешение для учетной записи; что-то вроде этого:
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();
Я определил свой класс, как это сделала Айенде в примере кода, найденного в решении:
public class AccountInfromationExtractor : IEntityInformationExtractor<Model.Account>
{
...
}
и я попытался привязать (в моем недействительном модуле) интерфейс IEntityInformationExtractor к классу
Bind<IEntityInformationExtractor<Model.Account>>()
.To<AccountInfromationExtractor>();
но когда я запускаю свое приложение, я получаю "Ссылку на объект, не установленную на экземпляр объекта". в классе безопасности. Локатор службы не может разрешить экземпляр, и он генерирует и исключение прямо здесь:
var extractor = ServiceLocator.Current.GetInstance<IEntityInformationExtractor<TEntity>>();
Есть ли кто-нибудь, кто пытался использовать Ninject с Rhino.Security и смог бы мне помочь?
Спасибо
1 ответ
В конце концов мне не удалось заставить его работать с Ninject, поэтому я переключился на StructureMap.
Rhino.Security работает с MS ServiceLocator для разрешения IEntityInformationExtractor. Я нашел адаптер ServiceLocator для StructureMap
Итак, я ссылался в своем проекте на следующие сборки:
Microsoft.Practices.ServiceLocation
StructureMap
StructureMapAdapter
изменил мой код для использования StructureMap:
public static class Bootstrapper
{
public static void Initialize()
{
ObjectFactory.Initialize(cfg =>
{
cfg.AddRegistry<StructureMapRegistry>();
});
ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container));
}
}
и мой класс StructureMapRegistry:
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>()));
});
}
}
Я надеюсь, что это может кому-то помочь.