Asp.net Boilerplate 中的动态权限

问题描述 投票:0回答:2

我需要为 asp.net 样板实现动态权限。然而,那里的团队确保关闭所有的大门以在运行时添加权限。

而且,这种和平的实现不是模块化的,它被初始化为核心依赖。

动态添加权限的最佳方式是什么?

c# aspnetboilerplate
2个回答
1
投票

这是我对这个问题的解决方案,我花了一段时间才成功做到这一点。

我尝试覆盖内部权限管理器,但它是隐藏的,无法覆盖它,所以唯一的方法是使用“温莎处理程序选择器”来强制使用我的 PermissionManager

1) 转到 BoilerPlate 并将此文件(PermissionDefinitionContextBase、PermissionDictionary、PermissionManager)复制到您的项目中。

2) 在 PreInitialize() 的核心模块中,在开头添加此行:

//Added this Handler so i can redirect every IPermissionManager to my Custom Implementation 

IocManager.IocContainer.Kernel.AddHandlerSelector(new PermissionManagerHandler());

3) 定义 PermissionManagerHandler

public class PermissionManagerHandler : IHandlerSelector
{
     public bool HasOpinionAbout(string key, Type service)
     {
        return typeof(IPermissionManager) == service;
     }
     public IHandler SelectHandler(string key, Type service, IHandler[] handlers)
     {
        return handlers.First(x => x.ComponentModel.Implementation == typeof(PermissionManager));
     }
}

4) 在核心模块PostInitilize()方法中添加

    IocManager.Resolve<PermissionManager>().Initialize();

5)在自定义权限管理器中,我通过添加

修改了初始化功能
Permissions.Clear();

6)每次我添加新的权限时,我都会调用初始化函数,这样我就可以使用命令重新发布所有内容:

IocManager.Resolve<PermissionManager>().Initialize();

0
投票

只需更改第 1 号中复制的文件的名称,然后更改命名空间,就像 @AhmedGhorab 所说的那样。

在处理程序中引用新名称类

 public IHandler SelectHandler(string key, Type service, IHandler[] handlers) {
       if (handlers.Any(x => x.ComponentModel.Implementation == typeof(ProdPermissionManager)) )
       {
          return handlers.First(x => x.ComponentModel.Implementation == typeof(ProdPermissionManager));
       }
       else
          return null; }
© www.soinside.com 2019 - 2024. All rights reserved.