Что лучший способ состоит в том, чтобы обработать несколько типов полномочий?

import json

class Foo(object):
    def __init__(self):
        self.bar = 'baz'
        self._qux = 'flub'

    def somemethod(self):
        pass

def default(instance):
    return {k: v
            for k, v in vars(instance).items()
            if not str(k).startswith('_')}

json_foo = json.dumps(Foo(), default=default)
assert '{"bar": "baz"}' == json_foo

print(json_foo)
22
задан naide 8 August 2018 в 14:56
поделиться

5 ответов

Я соглашаюсь с John Downey.

Лично, я иногда использую отмеченное перечисление полномочий. Таким образом, можно использовать И, ИЛИ, НЕ и битовые операции 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.
можно тогда сохранить разрешение одного пользователя в отдельный столбец DataBase (в нашем случае, которым это было бы 3).

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

13
ответ дан 29 November 2019 в 05:29
поделиться

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

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

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

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

9
ответ дан 29 November 2019 в 05:29
поделиться

В дополнение к John Downey и решениям jdecuyper, я также добавил "Явный, Отклоняют" бит в конце/начале битового поля, так, чтобы можно было выполнить аддитивные полномочия группы, ролевого членства, и затем вычитать полномочия, основанные на явном, не разрешают въезды, во многом как работы NTFS, мудрые разрешением.

2
ответ дан 29 November 2019 в 05:29
поделиться

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

, Например, Поставлющееся приложение могло бы сказать Вам, что ему нужно:

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

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

0
ответ дан 29 November 2019 в 05:29
поделиться

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

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

2
ответ дан 29 November 2019 в 05:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: