1

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

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

4

1 回答 1

1

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

  • 静态/普通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
    }
}

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

在数据库中,我有以下内容(EF 代码优先):

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

因此,对于每个权限,都会Permission在数据库中创建一个条目(在第一次分配时),并通过映射表使用IsAllowed定义“ALLOWED”或“DENIED”进行映射。
null值定义了未设置权限,因此可以使用默认值(=> 未设置权限并不总是说“拒绝”)。
映射表也可以以相同的样式用于例如角色。

于 2014-04-29T08:30:38.620 回答