Как спроектировать систему для фильтрации запросов по ролям?
У меня есть требование для разработки системы на основе службы 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){}
Примечание: может быть отношение один ко многим
3 ответа
Вы можете создать собственную реализацию IPrincipal, которая реализует IsInRole, обернув логику ранжирования, которую вы описываете.
Теперь, когда я посмотрю ближе на ваш вопрос, он звучит очень похоже на безопасность на основе ACL, а не на безопасность на основе ролей. Вы можете взглянуть на это вместо этого.
Вы не предоставили подробную информацию о системе. В зависимости от используемой технологии, уже есть проверенные и хорошо известные методы для управления именно этим (например, WCF дает вам это "бесплатно").
Образцы, вероятно, тоже не полны, потому что так, как вы их представили
Пользователь, Суперпользователь, Администратор
Администратор
Администратор
это может быть обработано с помощью простого перечисления, сравнения int и перечисления:
public enum Role {
Anonymous,
User,
SuperUser,
Admin
}
if (user >= (int)Role.User) ...
Но это, вероятно, слишком просто и не покрывает ваши реальные потребности? Вкратце: вы можете уточнить?
Разве вы не можете использовать битовый вектор для своих ролей (например, перечисление флагов)?
Таким образом, вы можете просто добавить биты в качестве "хэша".