Как спроектировать систему для фильтрации запросов по ролям? - PullRequest
1 голос
/ 22 декабря 2009

У меня есть требование спроектировать систему на основе службы 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){}

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

Ответы [ 3 ]

0 голосов
/ 22 декабря 2009

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


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

0 голосов
/ 22 декабря 2009

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

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

Пользователь, SuperUser, Admin
Администратор
Администратор

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

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

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

Но это, вероятно, слишком просто и не покрывает ваши реальные потребности? Короче говоря, можете ли вы уточнить?

0 голосов
/ 22 декабря 2009

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

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

...