存储查找值的最佳方式
本文关键字:最佳 方式 查找 存储 | 更新日期: 2023-09-27 17:49:44
这个问题困扰了我很久,我想向大家请教一下。
在我的应用程序中,允许10个用户角色。它是ASP。NET MVC2应用程序。每个控制器方法只能由一个特定的用户角色访问。
为了实现这个,我创建了一个UserRoleType Enum。
public enum UserRoleType
{
SystemAdministrator = 1,
SeniorLevelExecutive = 2,
SeniorManager = 3,
JuniorManager = 4,
SeniorAdmin = 5,
JuniorAdmin1 = 6,
JuniorAdmin2 = 7,
SeniorAppraiser = 8,
JuniorAppraiser = 9,
SeniorResearch = 10
}
这些值与数据库中的内容匹配(UserRole表有10行)。
用户的UserRoleId也存储在[user]表中。用户一登录,我们就从数据库中获取用户的roleId,并将其与上面的枚举进行匹配。例如,如果用户的roleId为4,则表示他/她是Junior Manager。
这个应用程序现在不在生产环境中。我看到的唯一缺点是,当我们上线时,如果由于某种原因,用户角色类型表中的值与Enum不匹配,我们将遇到大麻烦。还有其他选择吗?或者我应该集中精力确保我们在数据库中有匹配的值。如有任何帮助,我将不胜感激。
非常感谢!
我的观点是,如果你不能相信你自己在DB和Config文件中的配置,你就会陷入困境。只需确保您的DB记录将该值作为特定的列值,而不是自动生成的行ID。
如果RoleID的值不在Enum范围内,则不允许用户登录。
我会发邮件给管理员解决这个问题。
一个简单的方法是向UserRole表添加一个Name字段,并且在应用程序启动时,遍历枚举,根据ID查找该UserRole,并确保名称与UserRoleType.ToString()匹配。您应该能够实现这一点,而无需进行任何主要的代码更改。
private void VerifyUserRoles()
{
foreach (UserRoleType role in Enum.GetValues(typeof(UserRoleType)))
{
string dbName = /* SELECT Name FROM UserRole WHERE UserRoleId = (int)role */;
if(role.ToString() != dbName) throw new Exception();
}
}
更复杂的方法是根本不使用enum。如果您想让角色列表完全由数据库驱动,那么让UserRoleType成为一个带有私有构造函数的类,并让它执行数据库读取操作来创建对象列表。(我想这种模式应该有个名字,但不确定是什么。)显然,这将是对现有代码的一个更重要的更改。
public class UserRole
{
static List<UserRole> roles = new List<UserRole>();
static UserRole()
{
foreach (/* SELECT * FROM UserRole */)
{
roles.Add(new UserRole(...));
}
}
private UserRole(...){...}
// Permissions that the role consists of.
private bool CanEditEverything { get; private set; }
// Use this whenever you need to display a list of UserRoles.
public static ReadOnlyCollection<UserRole> AllUserRoles { get { return roles.AsReadOnly(); } }
// If you still need to explicitly refer to a role by name, rather than
// its properties, do these and set them in the static constructor.
public static UserRole SystemAdministrator { get; private set; }
}
我这样做了,但在DB中添加了适当的约束,约束描述将读者引导到enum。
我不确定您是否应该使用静态数据结构(如enum)来对动态数据结构(如表)中的元素进行建模。有一个UserRole
实体类和一个UserRoleCollection
集合类不是更好吗?这样,用户角色集可以更动态一些。当然,任何时候您的代码使用这些数据结构时,您都必须确保构建了故障安全机制,以便在遇到未知用户角色时始终拒绝对特定资源的访问。如果未知角色以某种方式进入数据库,代码自然会生成描述性消息。