Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
899
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Как лучше всего обрабатывать несколько типов разрешений?
Я часто сталкиваюсь со следующим сценарием, когда мне нужно предложить много различных типов разрешений. Я в основном использую ASP.NET / VB.NET с SQL Server 2000.
Сценарий
Я хочу предложить динамическую систему разрешений, которая может работать с различными параметрами. Допустим, я хочу предоставить доступ к приложению либо отделу, либо просто конкретному человеку. И представьте, что у нас есть ряд приложений, которые продолжают расти.
В прошлом я выбрал один из двух известных мне способов сделать это.
Используйте одну таблицу разрешений со специальными столбцами, которые используются для определение способа применения параметров. Специальные колонки в это примеры TypeID и TypeAuxID. SQL будет выглядеть как-то странно подобный этому.
SELECT COUNT(PermissionID) FROM application_permissions WHERE (TypeID = 1 AND TypeAuxID = @UserID) OR (TypeID = 2 AND TypeAuxID = @DepartmentID) AND ApplicationID = 1Используйте таблицу сопоставления для каждого типа разрешений, а затем соедините их все вместе.
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
свои мысли
Я надеюсь, что эти примеры имеют смысл. Я сложил их вместе.
Первый пример требует меньше работы, но ни один из них не кажется лучшим ответом. Есть ли лучший способ справиться с этим?
Я согласен с Джоном Дауни.
Лично я иногда использую помеченное перечисление разрешений. Таким образом, вы можете использовать побитовые операции 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), чтобы проверить, имеет ли пользователь определенное разрешение или нет.
Способ, которым я обычно иду о кодировании систем разрешений, состоит в том, чтобы иметь 6 таблиц.
- Пользователи - это довольно прямолинейно это ваша типичная таблица пользователей
- Группы-это будет синонимично вашим отделам
- Роли-это таблица со всеми разрешениями, как правило, также включающая понятное человеку имя и описание
- Users_have_Groups - это таблица many-to-many того, к каким группам принадлежит пользователь
- Users_have_Roles - еще одна таблица many-to-many о том, какие роли назначаются отдельному пользователю
- Groups_have_Roles-итоговая таблица many-to-many о том, какие роли есть у каждой группы
В начале сеанса пользователей вы бы запустили некоторую логику, которая извлекает каждую назначенную им роль, будь то каталог или через группу. Затем вы кодируете эти роли в качестве разрешений безопасности.
Как я уже сказал, это то, что я обычно делаю, но ваш миллиард может варьироваться.
В дополнение к решениям Джона Дауни и jdecuyper, я также добавил бит "Explicit Deny" в конце / начале битового поля, так что вы можете выполнять аддитивные разрешения по группе, членству в роли, а затем вычитать разрешения на основе явных запрещающих записей, так же как и NTFS работает с правами доступа.
Честно говоря, функции членства / ролей ASP.NET идеально подходят для описанного вами сценария. Написание собственных таблиц / procs / классов-это отличное упражнение, и вы можете получить очень хороший контроль над мельчайшими деталями, но после того, как я сделал это сам, я пришел к выводу, что лучше просто использовать встроенный материал .NET. Большая часть существующего кода предназначена для работы вокруг него,что очень хорошо. Написание с нуля заняло у меня около 2 недель, и это было далеко не так надежно, как раньше .NETs. Вы должны кодировать так много дерьма (восстановление пароля, автоматическая блокировка, шифрование, роли, интерфейс разрешений, тонны процессоров и т. д.), И это время можно было бы лучше потратить в другом месте.
Извините, если я не ответил на ваш вопрос, я похож на парня, который говорит, чтобы узнать c#, когда кто-то задает вопрос vb.
Подход, который я использовал в различных приложениях, заключается в том, чтобы иметь универсальный класс PermissionToken, который имеет свойство изменяемого значения. Затем вы запросите запрошенное приложение, и оно сообщит вам, какие PermissionTokens необходимы для его использования.
Например, приложение доставки может сообщить вам, что ему нужно:
new PermissionToken()
{
Target = PermissionTokenTarget.Application,
Action = PermissionTokenAction.View,
Value = "ShippingApp"
};
Очевидно, что это может быть расширено для создания, редактирования, удаления и т. д. и, благодаря свойству custom Value, любое приложение, модуль или виджет могут определять свои собственные необходимые разрешения. YMMV, но это всегда был эффективный метод для меня, который я нашел хорошо масштабируемым.