如何在没有硬编码的情况下使用Roles(asp.net)?

时间:2011-09-05 09:04:14

标签: asp.net dynamic roles

创建/删除角色时,我不想修改代码。

if (HttpContext.Current.User.IsInRole("Super Admin") ||
    HttpContext.Current.User.IsInRole("Admin") ||
    HttpContext.Current.User.IsInRole("Support"))
{
    if (HttpContext.Current.User.IsInRole("Admin"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin" });

    }
    if (HttpContext.Current.User.IsInRole("Support"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin", "Admin" });
    }
    fillDropDownCustomers();
}

4 个答案:

答案 0 :(得分:4)

将这些值放在静态类中:

public static class MyRoles
{
    public const string Admin = "Admin";
    public const string SuperAdmin = "Super Admin";
    public const string Support = "Support";
}

现在您可以像这样重复使用它们:

if (HttpContext.Current.User.IsInRole(MyRoles.SuperAdmin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Admin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Support))
{

答案 1 :(得分:2)

角色的工作方式是为用户可以执行的操作指定值。角色不会改变,但这些角色的行为确实如此。超动态解决方案往往过度杀伤。

所以也许你有以下角色

  • 超级管理员
  • 支持
  • 管理

您可以拥有不同的操作(这取决于您的系统)

  • 查看
  • 修改
  • 批准

Etc

  • 超级管理员[查看,编辑,批准]
  • 支持[查看]
  • 管理员[查看,修改]

动态部分来自动作的分配。以这种方式做事你不关心某人的角色,但他们有什么行动。行动是这种关系中的动态方面。发出请求时,您将使用用户角色将指定的操作提取到该角色(数据库驱动以使其可修改)

将其作为“ 角色有许多操作 ”并入您的数据库结构,意味着如果将来发生变化,您将需要更新数据库中的关系但不是代码。

数据库结构可能看起来像这样,取决于您的需求。

  • UserRole [ID,UserName,RoleID](如果为用户分配了多个角色,则他们会继承所有操作,这些操作可能会重复,因此会选择DISTINCT或阻止此方案,但我相信前者提供了更大的灵活性,没有复杂性和限制注意:UserRole表可以进一步非规范化以使UserNames唯一。)
  • 角色[ID,名称]
  • 行动[ID,名称]
  • RoleAction [ID,RoleID,ActionID](RoleID和ActionID上的唯一键约束)

发出请求时,您会识别用户等 用户名 ,然后锻炼 角色 他们通过查询RoleAction来加载他们相关的 操作

我会将 枚举 用于您的操作和角色值。这使得它更容易使用。要确保数据库和代码处于接收器中,请确保编写单元测试,将数据库值与枚举值进行协调。

答案 2 :(得分:0)

简单的答案是使用常量。更多上下文的答案是使用IoC将逻辑推送到另一个类,您可以在其中管理配置或数据库之间的关系。

答案 3 :(得分:0)

正如其他答案所暗示的那样,为常量变量。但是,如果要更改其中一个角色的名称,仍需要更改代码并重新发布。

另一种选择是将角色的名称添加到配置文件中。您将使用应用程序设置或继承自ConfigurationSection的自定义配置类。看一下http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

的方式

通过这种方式,您可以更改web.config文件中角色的名称,而无需更新任何代码或重新发布项目。