Сведения о вопросе

1234123213

16:03, 1st July, 2020

Теги

sql   permissions    

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

Просмотров: 358   Ответов: 5

Я часто сталкиваюсь со следующим сценарием, когда мне нужно предложить много различных типов разрешений. Я в основном использую 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
    

свои мысли

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

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



  Сведения об ответе

padenie

18:03, 1st July, 2020

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

Лично я иногда использую помеченное перечисление разрешений. Таким образом, вы можете использовать побитовые операции 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
}"

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

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

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





  Сведения об ответе

VERSUION

18:03, 1st July, 2020

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

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

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

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

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


  Сведения об ответе

SEEYOU

18:03, 1st July, 2020

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

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


  Сведения об ответе

lats

18:03, 1st July, 2020

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

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться