Как спроектировать систему фильтрации запросов по ролям?

У меня есть требование разработать систему на основе службы WCF для фильтрации запросов по ролям в C #.

Rules
    User can access X
    SuperUser can access Y
    Admin can access Z

    Database
    Resource AccessControl
    X        User,SuperUser,Admin
    Y        Admin
    Z        Admin

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

If(user = RequestUser.Role.User||user = RequestUser.Role.Admin)
{}

Вместо этого сделайте что-нибудь вроде этого

 Resource AccessControl               someCalculatedHashValue
    X        User,SuperUser,Admin     ????
    Y        Admin                    ????
    Z        Admin                    ????

if(user >= someCalculatedHashValue){}

Примечание: может быть один ко многим отношениям


person Nevin Mathai    schedule 22.12.2009    source источник
comment
У пользователя только одна роль?   -  person Mitchel Sellers    schedule 22.12.2009


Ответы (3)


Разве вы не можете использовать битовый вектор для своих ролей (например, перечисление флагов)?

Таким образом, вы можете просто сложить биты как свой «хэш».

person Oded    schedule 22.12.2009

Вы не смогли предоставить подробную информацию о системе. В зависимости от используемой технологии существуют уже проверенные и хорошо известные методы управления именно этим (например, WCF дает вам это «бесплатно»).

Образцы, вероятно, тоже не полные, потому что то, как вы их представили

Пользователь, Суперпользователь, Администратор
Администратор
Администратор

с этим можно справиться с помощью простого перечисления, сравнения int и перечисления, подобного этому:

public enum Role {
  Anonymous,
  User,
  SuperUser,
  Admin
}

if (user >= (int)Role.User) ...

Но это, наверное, слишком просто и не покрывает вашу реальную потребность? Вкратце: вы можете уточнить?

person Benjamin Podszun    schedule 22.12.2009
comment
Предположим, это сделано в WCF, что для этого доступно из коробки? - person Nevin Mathai; 22.12.2009
comment
WCF позволяет вам, в зависимости от вашего дизайна, выполнять авторизацию декларативным способом (без операторов if). Если вы хотите / должны сделать это в коде, он также поддерживает вас, но вы столкнетесь с той же проблемой, связанной с необходимостью сопоставления ролей с операциями. Итак - в этот момент вы вернетесь к своему беспорядку или вернетесь в начало. Вы можете либо посмотреть на перечисление, либо изучить, можно ли извлечь логику в метод расширения или что-то подобное, которое выполняет сопоставление между правом доступа и ролью / пользователем. - person Benjamin Podszun; 22.12.2009

Вы можете создать собственную реализацию IPrincipal который реализует IsInRole, обертывая описанную вами логику ранжирования.


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

person Mark Seemann    schedule 22.12.2009