Хранение уровня доступа пользователя в базе данных - PullRequest
6 голосов
/ 05 января 2010

Я храню список «Пользователи» в таблице.Бизнес-логика приложения будет иметь ссылку на объект со всеми данными в этой таблице для текущего пользователя, вошедшего в систему.И иметь возможность разрешать пользователю выполнять операции, если у него есть правильный доступ.

Мне интересно, как лучше всего хранить «уровни доступа»?

Один способ, которым яМысль о сохранении уровня доступа - это целое число, и использование «флагов» C # для объединения нескольких уровней доступа без необходимости в наборе полей, разумно ли это?

Create  = 1
Read    = 2
Update  = 4
Delete  = 8
FullAcc = 16

Другой вариант, о котором я думаюМне кажется, что он менее изящен, но я видел, что он многое сделал:

Read/Write  = 1
R/W + Delete= 2
Full Access = 3

Причина, по которой я задаюсь вопросом, заключается в том, что кажется, что было бы проще добавить дополнительные элементы ко второму методу,но в какой-то момент это стало бы болью в заднице, чтобы поддерживать.Что ты думаешь?

Ответы [ 4 ]

5 голосов
/ 05 января 2010

Я всегда предпочитал первый подход с использованием флагов. Опасность заключается в том, что вы получаете слишком много уровней разрешений, и вам нужно продолжать расширять свое перечисление и начинать использовать огромные числа, и, следовательно, возможно, придется изменить тип данных в вашей базе данных на большое int. Однако для чего-то вроде разрешений количество опций должно быть довольно ограничено. Одно из предложений, которое я хотел бы сделать, - это определить FullAcc как сумму Create, Read, Update и Delete, а не как отдельную сущность. Таким образом, вам не придется проверять, есть ли у пользователя разрешения «Обновить ИЛИ FullAcc», когда они пытаются что-то обновить.

3 голосов
/ 05 января 2010

Я бы выбрал вариант № 1, потому что он дает мне отдельные флаги для каждого типа доступа.

Я бы также рекомендовал хранить историю изменений с отметками времени.

1 голос
/ 05 января 2010

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

enum Rights { Create, read, Update, FullAcc = Create | Read | Update }

Единственная боль, которую я испытываю при этом, - это если вы добавляете больше элементов в перечисление, вам нужно изменить элемент FullAcc, а затем идентифицировать ваши записи FullAcc в БД и обновить значение флага.

1 голос
/ 05 января 2010

Я бы пошел по маршруту enum. Он строго типизирован, достаточно хорошо переносится между БД и кодом (целочисленные значения и перечисления правильно), вы можете использовать FlagsAttribute для объединения прав безопасности, а перечисления довольно гибки, когда речь идет о проблемах с версиями (если вы не удалите их). или переименуйте ранее определенные значения перечисления).

...