如何仅向具有admin角色的用户显示菜单栏中的特定选项

本文关键字:菜单栏 显示 选项 用户 admin 角色 何仅 | 更新日期: 2023-09-27 18:16:29

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

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

然后在网站中。我把菜单栏用户控件设置为false

DisplayAdminMenuItems在代码后面,我使用了以下逻辑:
if(user.username == "John"){
    MenuBar1.DisplayAdminOnlyMenuItems = true;
}

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

用户表: Name, Username, Department (Username为主键)

Roles table: RoleID, RoleName (RoleID为主键)

UserRole table: UserRoleID, Username, RoleID (UserRoleID为主键)

我有三个角色:Admin, Organizer和User我想只为具有Admin角色的用户显示Admin菜单,那么我该怎么做呢?

如何仅向具有admin角色的用户显示菜单栏中的特定选项

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

你上面使用的方法是不对的,因为它是不可伸缩的。如果有两个管理员呢?你会为每个管理员设置OR条件吗?

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

当你得到一个用户时,检查它的角色并根据角色显示UI

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

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

你应该做的是在你的用户类中添加一两个新方法来执行这个逻辑,这样你就不会在你的代码中到处都有对角色的引用,这样就可以适应未来的变化。

例如,如果你下周收到一个请求,要添加一个超级管理员角色,而这个角色也应该能够访问管理员角色的功能,而不给用户分配admin角色,你将很难更新你的代码。

但是,如果您在用户类中添加这样的方法:
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逻辑中使用这些方法中的一个来控制行为(我强烈推荐第一个)。

还要注意,在上面的两个例子中,如果user中的角色在字典中,例如,循环可以用对字典的.ContainsKey方法调用来代替。

您可以使用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>

我认为你需要启用RoleManager在你的网页。配置。还可以为匿名和其他普通登录用户指定控件。或者您可以使用Application_BeginRequest来获取此时的用户角色。