我正在开发一个客户需要和极其灵活的用户权限系统的应用程序。例如,用户应该能够在表格 A 中拥有更新权限,但在表格 B 中却没有(这使我无法定义广泛的更新权限)。管理员还应该能够将特定权限转移给用户。
我正在考虑使用Command Pattern
withCanExecute
方法,但不确定如何以这种动态/特定的方式使用它。有什么建议么 ?
我正在开发一个客户需要和极其灵活的用户权限系统的应用程序。例如,用户应该能够在表格 A 中拥有更新权限,但在表格 B 中却没有(这使我无法定义广泛的更新权限)。管理员还应该能够将特定权限转移给用户。
我正在考虑使用Command Pattern
withCanExecute
方法,但不确定如何以这种动态/特定的方式使用它。有什么建议么 ?
我的应用中也有类似的情况,可以通过插件进行扩展,插件可以引入自己的权限。我通过以下方式解决了这个问题:
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
}
}
这是我使用的基本模式。当然,您应该使用常量或类似的权限名称/键。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
值定义了未设置权限,因此可以使用默认值(=> 未设置权限并不总是说“拒绝”)。
映射表也可以以相同的样式用于例如角色。