Rhino.Security и IEntityInformationExtractor - PullRequest
2 голосов
/ 23 ноября 2010

Я недавно скачал 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 Ответ

1 голос
/ 30 ноября 2010

В конце концов мне не удалось заставить его работать с 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>()));
                });
    }
}

Надеюсь, это кому-нибудь поможет.

...