我正在开发一个客户端需要的应用程序和极其灵活的用户权限系统。例如,用户应该能够拥有表单A中的更新权限,但不能具有表单B中的更新权限(这使我无法定义广泛的更新权限)。管理员还应该能够将特定权限转让给用户。
我在考虑使用Command Pattern
和CanExecute
方法,但不确定如何以这种动态/特定的方式使用它。有什么建议吗?
答案 0 :(得分:1)
我的应用程序中也有类似情况,可以通过插件进行扩展,插件可以引入自己的权限。我通过以下方式解决了这个问题:
PermissionManager
简化的类结构:
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;)。
映射表也可以用于例如相同的样式。作用。