0

次のような一連のコマンドがあります。

  • 。キック
  • .unban
  • 。禁止
  • .unvouch
  • 保証します
  • 。追加
  • .del
  • 。いう

これらのコマンドは、異なるアクセス権を持つ複数のユーザーがいるチャット ルームで使用されます。たとえば、次のようになります。

  • 管理者はすべてのコマンドを使用できます。
  • モデレーターは、.kick、.vouch、.unvouch、.say の使用を許可されています
  • VIP は .say の使用を許可されています
  • 基本はコマンドを使用できません

コマンドが使用されると、部屋に存在するボットに送られ、そのボットはコマンドを実行する前に、ユーザー、アクセス、およびすべてを確認します。

最初に、リストに割り当てられたユーザー クラスがあります。

public class Users
{
    public string Name { get; set; }
    public string Comments { get; set; }
    public string Access { get; set; }
}

public List<Users> userList = new List<Users>();

特定のユーザーが特定のコマンドを使用するためのアクセス権を持っているかどうかを照会/チェック/検証する簡単な方法を実装したいと考えていますが、それにアプローチする方法がわかりません。

次のようなリストに 2 番目のクラスを割り当てることを考えていました。

public class UserAccess
{
    public string AccessLevel { get; set; }
    public List<string> Commands = new List<string>();
}

public List<UserAccess> accessList = new List<UserAccess>();

そして、次のようなクエリを実行します。

var user = userList.Find(x => x.Name == currentUser);
if (user != null && accessList.Exists(x => x.AccessLevel == user.Access && x.Commands.Contains(str_cmd))
{
    // use the command
}
else
{
    // cannot use the command
}

上で述べたように、ユーザーがコマンドを入力したときにキャプチャするチャット メッセージを常に読み取り、キュー内のすべてを確認して処理するバックグラウンド ワーカーがあります。

登録ユーザーとアクセス レベルは、Web サイトの API から入力されます。この API は、アプリケーションの起動時に JSON をアプリケーションに返し、主要なコマンドが発行されるたびにデータを更新します。

これはほんの一例です。考えすぎかもしれませんが、これに対処する方法についてアドバイスやアイデアを聞きたいです。

4

2 に答える 2

1

このようなものを試すことができます。ただし、Db を介して、または実際のコマンドが定義されている属性/プロパティを介してアクセス リストを定義することもできます。

public class User
{
    public static readonly UserAccess[] AccessList = {
            new UserAccess() { AccessLevel = "Admin",
                               Commands = {".kick",".ban",".unban"}
            },
            new UserAccess() { AccessLevel = "User",
                               Commands = {".add",".del"}
            },
            new UserAccess() { AccessLevel = "Vip",
                               Commands = {".say"}
            }};

    public string Name { get; set; }
    public string Comments { get; set; }
    public string Access { get; private set; } //Assuming you can't modify this so we add the next property
    public UserAccess AccessLevel { get; private set; }

    public User(string access)
    {
        this.Access = access;
        this.AccessLevel = AccessList.FirstOrDefault(x => x.AccessLevel == access);
    }
}

public class UserAccess
{
    public string AccessLevel { get; set; }
    public List<string> Commands = new List<string>();
    public bool HasCommand(string command)
    {
        return this.Commands.Any(x => x == command);
    }
}
于 2011-05-27T21:26:47.370 に答える
0

IRCボットまたはサービスアプリケーションのように見えます。このための「通常の」アプローチは、必要なアクセスレベルを表すintを持つコマンド/特権のリストと、対応するアクセスレベルを持つユーザーのリストを持つことです...コマンド/特権が使用されるときはいつでも、取得してみてくださいリストからのユーザーのアクセスレベル、またはユーザーがリストにない場合はデフォルト値(0)。次に、その値を使用されたコマンド/特権の値と比較します

利点:実装がかなり簡単です。
欠点:コマンド/特権レベルをある程度階層的に制限します。

任意の複雑な権限を許可する代替手段:

使用されるタイプ:

ユーザー-ユーザー
グループを表します-ユーザーオブジェクトのグループを表します
コンテキスト-ルールセットのコンテキストを表します(IRCの観点から、これはチャネルである可能性があります)
特権-使用できる特権またはコマンドを表します権限-特権を示し
ます許可または拒否されます

ユーザーオブジェクトとグループオブジェクトは、コンテキストによってアクセス許可のリストに関連付けることができます

コンテキストには、このコンテキストでアクセス許可を保持しているユーザー、またはこのコンテキストでアクセス許可を保持しているグループのメンバーであるユーザーの有効なアクセス許可のリストが格納されます。これらの有効な権限は、次の方法で決定されます。

for each user itterate all group memberships  
   for each group itterate all permissions  
      if the permission is denying a Privilege, add this privilege as denied to the effective permissions of this user, overwriting any permission for this privilege that may already be present in that list
      else, if the permission is granting a privilege add it to the effective permissions only if no permission for this privilege is present in the list

finally itterate over the users permissions
add the permission to the effective permissions list, overwriting any permission for this privilege that may already be present in the list.

すべての特権は、「拒否」として初期化されたデフォルトの権限を取得します(コンテキストに保存されます)

実行時にアクセス許可が変更されると、有効なアクセス許可が再構築されます。

システムが権限を確認する必要がある場合、システムはユーザーを検索し、最終的に認証を行います。ユーザーが認証されている場合、有効な権限はコンテキストによって検索されます。そのユーザーに対して有効な許可が見つかった場合、要求された特権が検索され、対応する許可がチェックされます。許可または拒否された場合、チェックは完了です。権限が見つからない場合は、その権限のデフォルトの権限が使用されます。

于 2011-05-27T22:18:29.327 に答える