2011-09-05 40 views
5

创建/删除角色时,我不想修改代码。如何使用角色(asp.net)而不对其进行硬编码?

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

回答

2

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

因此,也许你有下列角色

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

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

  • 查看
  • 编辑
  • 批准

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

动态部分来自动作的分配。以这种方式做事,你不在乎某人在什么角色,但他们有什么行为。行动是这种关系中的动态方面。当一个请求时,将使用用户角色来获取指定的操作给该角色(数据库驱动,使修改)

纳入到这个数据库结构“角色有很多动作”,是指如果事情在未来发生变化,您将需要更新数据库中的关系,但不包括代码。

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

  • 的UserRole [ID,用户名,角色ID(如果用户被分配它们继承的所有操作,这可能会被复制,因此选择DISTINCT或避免这种情况不止一个角色,但我相信前者提供了更大的灵活性,而不复杂性和局限性注意:UserRole表可以进一步非规范化以使UserNames具有唯一性。)
  • 作用[ID,名称]
  • 操作[ID,名称]
  • RoleAction [ID,角色ID,ActionID](唯一键约束上角色ID和ActionID)

当做出请求时,则识别用户等用户名,然后锻炼其中角色(S)它们在由quering的RoleAction并由此加载其相关联操作

我会用枚举您的行动和角色值。这使得它更容易处理。为了确保数据库和代码处于接收状态,请确保您编写单元测试来对照枚举值调整数据库值。

+0

我认为如果没有使用其他答案所建议的常量,那么这仍然需要将角色硬编码到代码中。 –

+0

这是肯定的,但是如问题中所阐述的那样使用角色还没有很好理解,因此当角色实际上是动态的行为时,他们希望将角色扩展为动态的。 – Jonathan

+1

非常感谢这个答案。这是非常有用的,因为我在每个需要执行操作的单个部分中启用/禁用用户,而不是向数据库询问他们是否有能力。然而,我仍然想知道如果一个特定的用户能够创建特定的记录但不是所有的记录会发生什么情况:创建一个名为“创建”的动作不是最有效的解决方案吗?我是否必须在表格Actions和其他表格之间创建关系?非常感谢你的帮助! – aleafonso

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)) 
{ 
0

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

0

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

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

这样你可以改变web.config文件中的角色的名称,你不必更新任何代码或重新发布项目。

相关问题