Ограничить значения перечисления по роли пользователя - PullRequest
3 голосов
/ 31 мая 2019

У меня есть перечень действий. Действия разделены на две роли пользователя. Пользователи делают запросы к приложению через веб-API. Как можно ограничить значения, принимаемые действием веб-API, в зависимости от роли пользователя?

На данный момент у меня две роли, и я использую два перечисления и два метода Web API. Когда значение передается в хранилище базы данных, оно приводится к целому числу. Это не идеально - я бы предпочел использовать объединение перечислений в интерфейсе репозитория.

Итак ...

Администраторы могут запросить выполнение действий из Enum1, а не администраторы могут сделать то же самое для действий в Enum2. Но метод репозитория, который выполняет работу, может работать с целочисленными значениями из обоих, потому что авторизация была обработана.

Наследование перечислений исправило бы это, если бы перечисления были наследуемыми.

enum EnumAdmin { Action1 = 1, Action2 = 2 }
enum EnumNotAdmin { Action3 = 3, Action4 = 4 }

void DoAction(int action);

[Authorize(Roles = "Admin")]
public IActionResult AdminMethod(EnumAdmin param)
{
   repos.DoAction((int) param);
}

[Authorize(Roles = "NotAdmin")]
public IActionResult AdminMethod(EnumNotAdmin param)
{
   repos.DoAction((int) param);
}

РЕДАКТИРОВАТЬ: Ну, здесь нечего видеть, так как моя схема все равно не работает.

Возможность назначить недопустимое значение Enum с помощью отражения

1 Ответ

0 голосов
/ 31 мая 2019

Вы обновили вопрос для определения проблемы.Я думаю, что вы можете использовать шаблон проектирования flyweight для этой проблемы.Не очень хорошо, но я пробовал ниже.Я использовал класс для роли.Поскольку тип enum запечатан.

   public class User
    {
        public string Name { get; set; }
    }

    public class RoleBase
    {

    }

    public class RoleAdmin: RoleBase
    {
     public bool Action1 { get; set; }
     public bool Action2 { get; set; }
    }

    public class RoleNotAdmin: RoleBase
    {
        public bool Action3 { get; set; }
        public bool Action4 { get; set; }
    }

    public interface IPermission
    {
        bool IsAuthorization(RoleBase role, User user);
    }

    public class PermissionAdmin : IPermission
    {
        public bool IsAuthorization(RoleBase roleBase, User user)
        {
            var roleAdmin = roleBase as RoleAdmin;

            return true;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...