Каковы недостатки использования флагов enum для разрешений? - PullRequest
2 голосов
/ 20 октября 2011

Пытаясь реализовать безопасность на основе ролей для веб-приложения, в базе данных есть таблица разрешений, ролей, пользователей и пользовательских ролей (т.е. назначение пользователей ролям).

Каждая роль имеет набор разрешений. Права доступа определяются как перечисление флагов C # со значениями, такими как 0, 1, 2, 4 и т. Д.

В базе данных у таблицы ролей есть поле int, в котором хранятся объединенные флаги разрешений для роли. (Таким образом, мы избегаем отдельной таблицы разрешений (это хорошо или плохо?) И таблицы «один ко многим» для RolePermissions.

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

Итак, мой вопрос:

Есть ли недостаток в том, чтобы делать это таким образом (в отличие от наличия таблицы разрешений и таблицы ссылок RolePermission (которая содержит 1 запись для каждого разрешения, предоставленного роли)?

Ответы [ 3 ]

1 голос
/ 20 октября 2011

Единственным недостатком является то, что вам придется писать больше кода для проверки прав доступа.Наличие отдельной таблицы с ролями пользователей позволяет очень просто определить их.

  • Преимущество: экономьте место для хранения (но кого это волнует в этом сценарии?)
  • Недостаток: сложность кода.
1 голос
/ 20 октября 2011

Я использовал флаг enum, как вы описали 3 года назад в проекте. Мои соображения:

  • Создайте слой, чтобы упростить использование, или вы получите грязный код в интерфейсе
  • Это не интуитивно понятно для «новых разработчиков». Если кто-то еще будет поддерживать этот код, имейте в виду, что он может пропустить всю идею и привнести больше сложности и / или ошибок ...

Ps:.

Каждая роль имеет набор разрешений. Права доступа определяются как перечисление флагов C # со значениями, такими как 0, 1, 2, 4 и т. Д.

НИКОГДА использовать 0 в перечислении флагов ...

1 голос
/ 20 октября 2011

Три непосредственных недостатка:

  • Флаги могут содержать только столько элементов, сколько доступно битов.
  • Запросы из базы данных теперь немного раздражают. Хорошо, только если вы используете SQL вручную (объединение с таблицей ролей для определения членства выглядит намного лучше).
  • При просмотре данных не в виде флагов кто-нибудь вспомнит, что означает значение 1 в четвертом бите?

Упростите жизнь и идите с отдельным списком. Назначается в коллекции, может очень хорошо сводиться к myPermissions.Contains(new Permission("CanEdit")). Затем вы можете использовать различные процедуры преобразования для преобразования жестко закодированных значений, таких как перечисления или строки, в объектные представления разрешений для достижения myPermissions.Contains("CanEdit") и т. Д.

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

...