我有web.config条目,如下所示。这是为了控制各种角色的用户访问各种页面。
管理员屏幕可以由招聘经理和CRM1访问 CRM3和受让人可以访问日志屏幕
add key="AdminScreenRoles" value ="Hiring Manager,CRM1"
add key="LogsScreenRoles" value ="CRM3,Transferee "
将来,新角色可以访问管理员界面。此外,还可能会推出新页面。
我需要确保当前用户可以访问配置文件中的至少一个页面。我有以下代码。有用。是否有更好/简洁/可扩展的代码用于此功能?
List<string> authorizedRolesForAdmin = new List<string>((ConfigurationManager.AppSettings["AdminScreenRoles"]).Split(','));
List<string> authorizedRolesForLogs = new List<string>((ConfigurationManager.AppSettings["LogsScreenRoles"]).Split(','));
if ((authorizedRolesForAdmin.Contains(roleName)) || (authorizedRolesForLogs.Contains(roleName)))
{
//Has access to at least one page
}
参考:
答案 0 :(得分:2)
您绝对可以大大简化现有代码:
var hasOneRole =
new [] { "Admin", "Log" }
.SelectMany( screen => ( ConfigurationManager.AppSettings[ screen + "ScreenRoles" ] ?? "" ).Split( ',' ) )
.Contains( roleName );
但随着时间的推移,这仍然会变得丑陋。 Web.config只是不适合那种东西。我建议你将访问控制设置放在数据库中。
答案 1 :(得分:1)
如果不是几个建议,请不要在这里找到更多空间来改善事情,例如:
如果角色列表的数量变大
Dictionary<RoleName..>
或HashSet
可以你可以控制喜欢的存在,避免创建额外的List<T>
实例
(ConfigurationManager.AppSettings["AdminScreenRoles"]).
Contains("roleName,")//tiny optimization....
但正如我之前所说,代码现在看起来最好,因为它易于理解和阅读。
答案 2 :(得分:0)
你可以避免拆分字符串,而是使用类似这样的东西,它应该稍快一些:
string authorizedRolesForAdmin = string.Concat(",", ConfigurationManager.AppSettings["AdminScreenRoles"]), ",");
string authorizedRolesForLogs = string.Concat(",", ConfigurationManager.AppSettings["LogsScreenRoles"]), ",");
string searchString = string.Concat(",", roleName, ",");
if ((authorizedRolesForAdmin.Contains(roleName)) || (authorizedRolesForLogs.Contains(roleName)))
{
//Has access to at least one page
}
这避免了比较昂贵的string.Split,也避免了创建两个列表。值得注意的是string.Contains
只是.NET4;在旧版本中,您需要检查string.IndexOf
的值。