4

以下に示すように、web.config エントリがあります。これは、さまざまなロールのユーザーのさまざまなページへのアクセスを制御するためのものです。

管理者画面は採用担当者と CRM1 がアクセス可能 ログ画面は CRM3 と転勤者がアクセス可能

add key="AdminScreenRoles" value ="Hiring Manager,CRM1"
add key="LogsScreenRoles" value ="CRM3,Transferee "

将来的には、新しいロールに管理者画面へのアクセス権を付与できます。また、新しいページが導入される場合があります。

現在のユーザーが構成ファイル内の少なくとも 1 つのページにアクセスできるようにする必要があります。次のコードがあります。できます。この機能のためのより良い/簡潔/スケーラブルなコードはありますか?

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>追加のインスタンスの作成を回避して、likeの存在を制御できる可能性があります

(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が回避され、2つのリストの作成も回避されます。注目に値するstring.Containsのは.NET4のみです。古いバージョンでは、string.IndexOf代わりにの値を確認します。

于 2012-08-02T14:08:56.993 に答える