授予超级灵活的用户访问/修改权限系统

时间:2014-04-29 08:27:06

标签: c# admin command-pattern access-rights

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

我在考虑使用Command PatternCanExecute方法,但不确定如何以这种动态/特定的方式使用它。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

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

  • static / common 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
    }
}

这是我使用的基本模式。当然,您应该使用常量或类似的权限名称/键。然后,管理UI可以在配置UI中迭代AvailablePermissions

在DB中,我有类似以下内容(EF Code-First):

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; }
}

因此,对于每个权限,在DB中创建一个Permission条目(在第一个分配上),并使用IsAllowed通过映射表进行映射以定义&#34;允许&#34;或者&#34; DENIED&#34;。
null值定义了未设置的权限,因此可以使用默认值(=&gt;未设置权限并不总是说&#34; DENIED&#34;)。 映射表也可以用于例如相同的样式。作用。