【问题标题】:How to display specific options in the menu bar just to the user with the admin role?如何仅向具有管理员角色的用户显示菜单栏中的特定选项?
【发布时间】:2011-12-03 19:25:21
【问题描述】:

我正在开发一个 Web 应用程序,它向管理员显示的菜单栏与向普通用户显示的菜单栏不同。我的意思是如果用户是管理员,他会看到一些与系统本身的设置相关的选项。 我将菜单栏创建为用户控件 (ascx),并在其代码隐藏中定义了以下方法:

public bool DisplayAdminOnlyMenuItems
    {
        get { return menuItem1ToHide.Visible; }
        set
        {
            menuItem1ToHide.Visible = value;
        }
    }

然后在 site.master 页面中,我将菜单栏用户控件设置为 false

在代码隐藏中,我使用以下逻辑:

if(user.username == "John"){
    MenuBar1.DisplayAdminOnlyMenuItems = true;
}

一切正常。现在,我有了新的要求,这让我的生活变得有点复杂。 我的数据库中有三个表,其结构如下:

用户表:姓名、用户名、部门(用户名为主键)

角色表: RoleID、RoleName(RoleID为主键)

UserRole表: UserRoleID、Username、RoleID(UserRoleID为主键)

我有三个角色:管理员、组织者和用户 我想只为具有管理员角色的用户显示管理员菜单,我该怎么做?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:
    if(user.username == "John"){
        MenuBar1.DisplayAdminOnlyMenuItems = true;
    }
    

    您上面使用的方法不正确,因为它不可扩展。如果有两个管理员怎么办?你会为每个管理员设置一个 OR 条件吗?

    正确的方法是您基于角色而不是用户的新要求。

    当您获得用户时,检查其角色并根据角色显示 UI

    if(user.RoleName == "Admin"){
        MenuBar1.DisplayAdminOnlyMenuItems = true;
    }
    

    如果你有UserName,我假设你可以得到RoleName

    【讨论】:

      【解决方案2】:

      您应该做的是向您的用户类添加一个或两个新方法来执行此逻辑,这样您就不会在整个代码中引用角色,从而可以适应未来的更改。

      例如,如果您在下周收到添加超级管理员角色的请求,并且该角色还应该能够访问管理员角色功能而无需为用户分配管理员角色,那么您将很难更新你的代码。

      但是,如果您将这样的方法添加到您的用户类:

      public const string ADMIN_ROLE = "ADMIN";
      public const string SUPER_ADMIN_ROLE = "SUPERADMIN";
      
      public bool HasAdminAuthority() {
         // Assuming roles are not indexed by name
         foreach (string sRole in this.Roles) {
            switch (sRole.ToUpper()) {
                case ADMIN_ROLE:
                   return true;
      
                case SUPER_ADMIN_ROLE:
                   return true;
      
            }
         }
      
         return false;
      }
      

      另一个有用的添加方法是:

      public bool IsInRole(string sRoleToFind) {
      
         foreach (string sRole in this.Roles) {
            if (sRoleToFind.Equals(sRole, StringComparison.InvariantCultureIgnoreCase) {
               return true;
            }
         }
         return false;
      }
      

      然后,您可以在 UI 逻辑中使用其中一种方法来控制行为(我强烈推荐第一种)。

      另请注意,在上述两个示例中,例如,如果用户中的角色在字典中,则可以将循环替换为字典上的.ContainsKey 方法调用。

      【讨论】:

        【解决方案3】:

        您可以使用LoginView 控件。

        <asp:LoginView ID="lgvAdmins" runat="server">
             <asp:rolegroup roles="Administrators">
                  <contenttemplate>
                       ...controls...
                  </contenttemplate>
             </rolegroup>
             <asp:rolegroup roles="Users">
                  <contenttemplate>
                       ...controls...
                  </contenttemplate>
             </rolegroup>
        </asp:LoginView>
        

        我认为您需要在 web.config 中启用 RoleManager。您还可以为匿名用户和其他正常登录用户指定控件。或者您可以使用 Application_BeginRequest 来获取此时用户的角色。

        【讨论】:

          猜你喜欢
          • 2020-02-16
          • 1970-01-01
          • 1970-01-01
          • 2017-01-28
          • 1970-01-01
          • 2016-12-17
          • 2014-05-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多