处理每个访问级别的允许命令?

时间:2011-05-27 21:18:13

标签: c# .net-3.5 access-levels

我有一组命令,如:

  • .kick
  • .unban
  • .ban
  • .unvouch
  • .vouch
  • 。新增
  • .DEL
  • .say

这些命令用于聊天室,我有几个具有不同访问权限的用户,例如:

  • 允许管理员使用所有命令。
  • 主持人可以使用.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>();

现在我想实现一种简单的方法来查询/检查/验证给定用户是否有权使用给定的命令,但我不确定如何处理它。

我正在考虑将第二个类分配给类似这样的列表:

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
}

正如我上面提到的,我有一个后台工作人员,当用户输入一个命令然后验证并处理队列中的所有内容时,他们会不断阅读聊天消息。

注册用户和访问级别是从我的网站API填写的,它在启动时会将JSON返回给我的应用程序,并且每当发出主要命令时都会更新数据。

这只是一个例子,我可能会过度思考这个想法,但我确实想听听一些关于如何处理这个问题的建议和想法?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

看起来像一个IRC机器人或服务应用程序。 &#34;通常&#34;方法是获得一个命令/特权列表,其中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.

所有权限都获得默认权限,初始化为&#34;拒绝&#34; (存储在上下文中)

在运行时更改权限时,将重建有效权限。

当系统必须检查权限时,它会查找用户并最终进行身份验证。如果用户通过身份验证,则上下文会查找有效权限。如果为该用户找到有效的权限,则查找所请求的权限,并检查相应的权限。如果我们获得批准或拒绝,则检查完成。如果未找到权限,则使用该权限的默认权限。