4

我有如下所示的 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
}

参考

  1. 用于从配置文件创建数组的可扩展 C# 代码
4

3 回答 3

2

您绝对可以像这样显着简化现有代码:

var hasOneRole =
    new [] { "Admin", "Log" }
    .SelectMany( screen => ( ConfigurationManager.AppSettings[ screen + "ScreenRoles" ] ?? "" ).Split( ',' ) )
    .Contains( roleName );

但随着时间的推移,这仍然会变得丑陋。Web.config 只是不适合那种东西。我建议您将访问控制设置放入数据库中。

于 2012-08-02T14:06:47.023 回答
1

如果不是一些建议,请不要在这里看到太多空间来使事情变得更好,例如:

如果角色列表的数量变大

  • 使用Dictionary<RoleName..>HashSet

也许你可以控制喜欢的存在,避免创建额外的List<T>实例

(ConfigurationManager.AppSettings["AdminScreenRoles"]).
              Contains("roleName,")//tiny optimization....

但正如我之前所说,现在看起来的代码是最好的,因为它易于理解和阅读。

于 2012-08-02T14:05:28.523 回答
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改为检查 的值。

于 2012-08-02T14:08:56.993 回答