我有一个权限属性,它获取角色的枚举值列表:
[CheckRoles(SystemRole.ID.Admin, SystemRole.ID.User)]
public class MyController : Controller
{
....
}
但是,在代码的其他部分,我想检查用户是否处于这些角色中,因此我可以转到正确的页面。所以代码看起来像:
if (roles.IsInAnyRoles(user, SystemRole.ID.Admin, SystemRole.ID.User)
{
... Do something in MyController ...
}
你可以在这里看到重复。我真的希望在变量或初始化列表中有两个角色,我可以将它传递给属性和方法。创建const数组不起作用。有办法做到这一点吗?我可以以某种方式存储阵列初始化器吗?
非常感谢任何帮助!
更新
我已经将角色枚举成了一个Flags枚举(并给出了适当值的项)。这意味着我可以将值或值一起给出单个恒定值。 我现在可以在Attribute和方法中使用该常量值。 感谢下面的Danny Chen。
答案 0 :(得分:4)
在我的实际项目经验中,我想定义这样的角色;
[Flags]
public enum Role
{
Staff = 0,
Supervisor = 1,
Manager = 2,
Admin = 4,
HelpDesk = 8
}
原因是一个帐户通常有一些关联的角色,例如某人是Bob的主管,他也是IT部门的经理。在这种情况下,他的角色是Role.Supervisor | Role.Manager
,因此他可以使用提供给Role.Supervisor的所有功能(例如批准Bob的离开请求),同时他可以批准所有IT部门员工的请求。该动作如下:
[CheckRole(Role.Supervisor, Role.Manager)]
public ActionResult ApproveLeavingRequest()
{
//the roles in the constructor of CheckRoleAttribute are OR related
}
[CheckRole(Role.Manager|Role.Supervisor, Role.Admin)]
public ActionRequest ModifySystemSettings()
{
//this method is provided to a small group of people
//those who is a manager and a supervisor
//or he is an admin
}
[CheckRole(Role.Manager|Role.Supervisor|Role.Admin)]
//maybe we need to add Role.Boss into the system :)
public ActionRequest IncreasePay()
{
//only the boss account can invoke this method
}
希望这有帮助。