Ich habe kürzlich Rhino.Security heruntergeladen und ich versuche, Berechtigungen für eine Entität zu implementieren. Da ich Ninject (v2) mag, würde ich gerne ein einfaches Beispiel zusammenstellen. In meinem NinjectModule ich das Repository und die Dienste gebunden haben:Rhino.Security und 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();
ich alles in einer Konsole app mich entschieden und alles funktioniert. Ich kann diesen Test ohne Probleme laufen:
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();
}
}
Nun würde Ich mag eine Erlaubnis für ein Konto definieren; so etwas wie diese:
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();
Ich habe meine Klasse definiert, wie Ayende in dem Beispielcode in der Lösung gefunden hat:
public class AccountInfromationExtractor : IEntityInformationExtractor<Model.Account>
{
...
}
und ich habe zu binden versucht (in meinem ninject Modul) die Schnittstelle IEntityInformationExtractor der Klasse
Bind<IEntityInformationExtractor<Model.Account>>()
.To<AccountInfromationExtractor>();
aber wenn ich meine app betreibe ich eine bekommen „Objekt Verweis auf eine Instanz nicht eines Objekts festgelegt.“ in der Sicherheitsklasse. Der Service Locator kann nicht die Instanz beheben und es erzeugt und Ausnahme hier:
var extractor = ServiceLocator.Current.GetInstance<IEntityInformationExtractor<TEntity>>();
Gibt es jemanden, der versucht Ninject mit Rhino.Security zu nutzen und mir zu helfen, wäre in der Lage?
Dank