Каков наилучший способ справиться с несколькими типами разрешения?

голоса
17

Я часто сталкиваюсь с таким сценарием, когда мне нужно, чтобы предложить много различных типов разрешений. Я в первую очередь использовать ASP.NET / VB.NET с SQL Server 2000.

сценарий

Я хочу предложить динамическую систему разрешений, которые могут работать на различных параметрах. Допустим, что я хочу дать либо отдел или только определенный человеку доступ к приложению. И делать вид, что у нас есть целый ряд приложений, которые постоянно растут.

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

1) Используйте одну таблицу разрешения со специальными колоннами, которые используются для определения того, как применить параметры. Специальные колонки в этом примере TypeID и TypeAuxID. SQL будет выглядеть примерно так.

SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1

2) Используйте таблицу отображения для каждого типа разрешения, а затем объединить их все вместе.

SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE q.SectionID=@SectionID
  AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
 (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC

Мои мысли

Я надеюсь, что эти примеры имеют смысл. Я мощеные их вместе.

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

Задан 04/08/2008 в 18:46
источник пользователем
На других языках...                            


5 ответов

голоса
10

Я согласен с Джоном Дауни.

Лично я иногда использую помеченный перечень разрешений. Таким образом, вы можете использовать AND, OR, NOT и битовые операции XOR по пунктам перечисления.

"[Flags]
public enum Permission
{
    VIEWUSERS = 1, // 2^0 // 0000 0001
    EDITUSERS = 2, // 2^1 // 0000 0010
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100
    EDITPRODUCTS = 8, // 2^3 // 0000 1000
    VIEWCLIENTS = 16, // 2^4 // 0001 0000
    EDITCLIENTS = 32, // 2^5 // 0010 0000
    DELETECLIENTS = 64, // 2^6 // 0100 0000
}"

Затем, вы можете объединить несколько разрешений с помощью оператора И побитового.

Например, если пользователь может просматривать и редактировать пользователей, бинарный результат операции 0000 0011 которая преобразуется в десятичную : 3.
Вы можете хранить разрешение одного пользователя в одном столбце вашей базы данных (в нашем случае это будет быть 3).

Внутри вашего приложения, нужно просто другая операция поразрядного (OR) , чтобы проверить , если пользователь имеет особое разрешение или нет.

Ответил 04/08/2008 в 19:23
источник пользователем

голоса
10

То, как я обычно идет о системах кодирования разрешения с 6 таблиц.

  • Пользователи - это довольно прямо вперед, это ваши типичные таблицы пользователей
  • Группы - это было бы синонимами ваших отделов
  • Роли - это таблица со всеми разрешениями, как правило, также включая читаемое имя человека и описание
  • Users_have_Groups - это многие-ко-многим таблице каким группам пользователь принадлежит
  • Users_have_Roles - еще многие-ко-многим таблице, какие роли назначены отдельному пользователю
  • Groups_have_Roles - окончательный многие-ко-многим таблице, какую роль каждая группа имеет

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

Как я уже сказал, это то, что я обычно делаю, но ваш Миледж может отличаться.

Ответил 04/08/2008 в 18:56
источник пользователем

голоса
2

Честно ASP.NET Membership / Роль функция будет работать идеально для сценария вы описали. Написание собственных таблиц / проки / классы отличное упражнение, и вы можете получить очень хороший контроль над мелкими деталями, но после того, как делает это сам, я пришел к выводу, что лучше всего использовать встроенные в .NET вещи. Много существующего кода предназначен для работы вокруг него, и это приятно на хорошо. Запись с нуля заняло у меня около 2 недель, и это не было где рядом столь надежен, как .NETs. Вы должны кодировать так много дерьма (восстановление пароля, автоматическое локаут, шифрование, роли, интерфейс разрешения, тонн проки и т.д.) и время можно было бы лучше потратить в другом месте.

Извините, если я не ответил на ваш вопрос, я как парень, который говорит, чтобы узнать C #, когда кто-то задает вопрос Vb.

Ответил 07/08/2008 в 03:23
источник пользователем

голоса
2

В дополнении к Джон Дауни и решениям jdecuyper, я имею также добавил «Явной Запретить» бит в конце / начале битового поля, так что вы можете выполнять разрешения аддитивной группы, членством в ролях, а затем вычесть разрешения, основанные на явно отрицают записи, так же, как работает NTFS, то разрешение мудрым.

Ответил 04/08/2008 в 19:39
источник пользователем

голоса
0

Подход, который я использовал в различных приложениях, чтобы иметь общий класс PermissionToken который имеет изменяемое свойство Value. Тогда вы запрашиваете запрашиваемое приложение, оно говорит вам, какие PermissionTokens необходимы для того, чтобы использовать его.

Например, приложение Shipping может сказать вам, что нужно:

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

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

Ответил 04/08/2008 в 19:03
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more