C# 授予优步灵活的用户访问/修改权限系统

C# 授予优步灵活的用户访问/修改权限系统,c#,admin,command-pattern,access-rights,C#,Admin,Command Pattern,Access Rights,我正在开发一个应用程序,其中客户需要一个非常灵活的用户权限系统。例如,用户应该能够在表格a中拥有更新权限,但不能在表格B中拥有更新权限(这使我无法定义广泛的更新权限)。管理员还应该能够将特定的权限转移给用户 我曾考虑将命令模式与CanExecute方法结合使用,但不确定如何以这种动态/特定的方式使用它。有什么建议吗?我的应用程序中也有类似的情况,可以通过插件进行扩展,并且插件可以带来自己的权限。我用以下方法解决了这个问题: 静态/通用PermissionManager 每个模块/表单/插件都可

我正在开发一个应用程序,其中客户需要一个非常灵活的用户权限系统。例如,用户应该能够在表格a中拥有更新权限,但不能在表格B中拥有更新权限(这使我无法定义广泛的更新权限)。管理员还应该能够将特定的权限转移给用户


我曾考虑将
命令模式
CanExecute
方法结合使用,但不确定如何以这种动态/特定的方式使用它。有什么建议吗?

我的应用程序中也有类似的情况,可以通过插件进行扩展,并且插件可以带来自己的权限。我用以下方法解决了这个问题:

  • 静态/通用
    PermissionManager
  • 每个模块/表单/插件都可以在管理器中注册其可用权限
  • “权限管理器UI”列出所有可用权限,并允许管理员将其分配给用户
  • 在访问时,每个模块/表单/插件都会询问管理员当前用户是否具有该权限
简化的班级结构:

public class PermissionManager
{
    public static Dictionary<string, IEnumerable<string>> AvailablePermissions { get; set; }
    public static bool? Can(User user, string permission)
    {
        // check DB
        return DENIED ? false : (ALLOWED ? true : null);
    }
}

public class MyPlugin : IPlugin
{
    public void Init()
    {
        PermissionManager.AvailablePermissions["MyPlugin"] = 
            new List<string>() { "Permission1", "Permission2" };
    }

    public void DoWork()
    {
        if (PermissionManager.Can(user, "Permission1") != true)
            throw new NotAllowedException();
        // do work
    }
}
因此,对于每个权限,都会在DB中创建一个
权限
条目(在第一次分配时),并通过映射表映射,使用
IsAllowed
定义“允许”或“拒绝”。
null
值定义了未设置权限,因此可以使用默认值(=>未设置权限并不总是说“拒绝”)。

映射表也可以以相同的样式用于角色等。

感谢您的回答,这看起来很不错。你的设计在DB方面如何?例如,是否在表中手动指定该模块的权限类型?@Cemre:添加了基本架构。
public class UserProfilePermissions
{
    public UserProfile User { get; set; }
    public Permission Permission { get; set; }
    public bool IsAllowed { get; set; }
}
public class Permission
{
    public int Id { get; set; }
    public string Key { get; set; }
    public string Group { get; set; }
}