Работа с разрешенными командами для уровня доступа? - PullRequest
0 голосов
/ 28 мая 2011

У меня есть набор команд, таких как:

  • .kick
  • .unban
  • .ban
  • .unvouch
  • .vouch
  • .add
  • .del
  • .say

Эти команды используются в чате, где у меня несколько пользователей.с другим доступом, например:

  • Администратору разрешено использовать все команды.
  • Модератору разрешено использовать .kick, .vouch .unvouch .say
  • Vip разрешено использовать .say
  • Basic не может использовать никакую команду

Когда используется команда, она идет к боту, который присутствует в комнате, этот бот будет проверять ихuser, access и все до выполнения команды.

Изначально у меня есть класс пользователя, назначенный списку:

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 ]

1 голос
/ 28 мая 2011

Вы можете попробовать что-то вроде этого.Хотя вы можете определить свой список доступа через 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);
    }
}
0 голосов
/ 28 мая 2011

выглядит как бот 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.

все привилегии получают разрешение по умолчанию, инициализируемое как «отказано» (сохранено в контексте)

при изменении разрешений во время выполнения,действующие разрешения должны быть перестроены.

когда система должна проверить разрешение, она ищет пользователя и в конечном итоге выполняет аутентификацию.если пользователь аутентифицирован, действующие разрешения ищутся контекстом.если для этого пользователя найдены эффективные разрешения, запрашивается запрашиваемая привилегия и проверяется соответствующее разрешение.если мы либо получим, либо отклоним, проверка будет завершена.если разрешение не найдено, используется разрешение по умолчанию для этой привилегии.

...