如何仅向具有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菜单,那么我该怎么做呢?
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来获取此时的用户角色。