我有一个asp.net mvc项目,持久性由存储库处理。使用表单身份验证。现在我需要实施授权。例如,我需要确保经理用户只能打开他/她的任务并将工作人员分配到任务中。工人只能看到分配给他/她的任务。超级版主可以编辑所有内容。 是否有任何可以使用的框架允许我定义权限?
我正在评估Ayende Rhino Security。我在哪里可以获得更多示例代码?您对Rhino Security有何看法?
我的项目使用Linq to SQL并且没有使用NHibernate。 Rhino Security可以在没有NHibernate的情况下工作吗?
答案 0 :(得分:5)
恐怕Rhino Security依赖Nhibernate工作
我一直在评估Rhino Security几个月,最后,我决定使用它,因为它是一个非常好的产品。
您可以在Ayende blog或here找到有用的信息。
我有点疏远将它与StructureMap(而不是Castle Windsor)集成。您可以找到一些信息here
要做你想要实现的目标,你必须定义一个实现IEntityInformationExtractor接口的类。
首先,你必须添加以下引用(我已经用NH 3.0重新编译了Rhino Security):
然后定义一个引导程序:
public static class Bootstrapper
{
public static void Initialize()
{
ObjectFactory.Initialize(cfg =>
{
cfg.UseDefaultStructureMapConfigFile = false;
cfg.IgnoreStructureMapConfig = true;
cfg.AddRegistry<StructureMapRegistry>();
});
ServiceLocator.SetLocatorProvider(() => new StructureMapServiceLocator(ObjectFactory.Container));
}
}
然后定义StructureMap注册表类:
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.Task>>()
.Use(p =>
{
return (new TaskInfromationExtractor(p.GetInstance<ISession>()));
});
}
}
NHSessionFactory 基本上创建了一个NH会话工厂。
我创建了一个实现IEntityInformationExtractor的类( TaskInfromationExtractor )。这将允许您为任务实体定义权限。 现在您的应用已经准备就绪你只需要“引导”结构图:
当您的应用启动时,您会这样做。 现在您可以使用Rhino安全存储库和服务来创建用户,组,关系等等,作为我给你建议的链接。 你可以找到我准备的样本here
答案 1 :(得分:1)
我认为asp.net mvc attributes对于这样的任务会有好处。
首先,您需要创建一些角色列表,并以某种方式与用户一起引用它。 在登录后,您需要在Session中存储用户角色。 比使用此属性标记控制器或操作。 在属性中,您应该传递需要执行某些操作的角色。 在属性实现中,您只需检查用户是否具有某个角色,然后无需执行任何操作,否则将重定向到未授权的页面。或者在global.asax中抛出一些自定义异常并重定向。
Mb检查this文章以获取代码示例。
答案 2 :(得分:1)
也查看这个。它易于使用。