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)
Я соглашаюсь с 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).
Внутренняя часть Ваше приложение, Вам просто нужна другая битовая операция (ИЛИ) проверить, есть ли у пользователя конкретное разрешение или нет.
Путем я обычно иду о кодировании систем разрешения, имеет 6 таблиц.
В начале пользовательской сессии, Вы выполнили бы некоторую логику, которая вытаскивает каждую роль, которую они присвоили, или каталог или через группу. Тогда Вы кодируете против тех ролей Ваших прав доступа.
Как я сказал, что это - то, что я обычно делаю, но Ваш millage может варьироваться.
В дополнение к John Downey и решениям jdecuyper, я также добавил "Явный, Отклоняют" бит в конце/начале битового поля, так, чтобы можно было выполнить аддитивные полномочия группы, ролевого членства, и затем вычитать полномочия, основанные на явном, не разрешают въезды, во многом как работы NTFS, мудрые разрешением.
Подход, который я использовал в различных приложениях, должен иметь универсальный класс PermissionToken, который имеет изменяемое свойство Value. Тогда Вы запрашиваете требуемое приложение, оно говорит Вам, которые PermissionTokens необходимы для использования его.
, Например, Поставлющееся приложение могло бы сказать Вам, что ему нужно:
new PermissionToken()
{
Target = PermissionTokenTarget.Application,
Action = PermissionTokenAction.View,
Value = "ShippingApp"
};
Это может, очевидно, быть расширено, чтобы Создать, Отредактировать, Удалить и т.д. и, из-за пользовательского свойства Value, любое приложение, модуль или виджет могут определить свои собственные необходимые полномочия. YMMV, но это всегда было эффективным способом для меня, которого я нашел для масштабирования хорошо.
Честно функции ASP.NET Membership / Roles работали бы отлично на сценарий, который Вы описали. При записи собственных таблиц / procs / классы являются большим осуществлением, и можно получить очень хороший контроль над мелкими подробностями, но после выполнения этого самостоятельно я пришел к заключению, что лучше просто использовать созданный в материале.NET. Много существующего кода разработано для работы вокруг этого, который хорош в хорошо. Запись с нуля взяла меня приблизительно 2 недели, и это было не где рядом столь же устойчиво как.NETs. Необходимо кодировать так много дерьма (восстановление пароля, автоматический локаут, шифрование, роли, интерфейс разрешения, тонны procs, и т.д.), и время могло быть лучше проведено в другом месте.
Жаль, если я не отвечал на Ваш вопрос, я похож на парня, который говорит для изучения c#, когда кто-то задает vb вопрос.