python - 使用Python集合类型实现ACL

标签 python set acl pickle

目前我有这样的表:Pages, Groups, GroupPage, Users, UserGroup。使用 pickled sets 我可以只用 3 个表实现同样的事情:Pages, Groups, Users

set 似乎是实现 ACL 的自然选择,因为组和权限相关的操作可以用集合非常自然地表达。如果我将允许/拒绝列表存储为 pickled 集,它可以消除多对多关系的几个中间表,并允许在没有许多数据库操作的情况下进行权限编辑。

如果人类可读性很重要,我总是可以使用 json 而不是 cPickle 进行序列化,并在 Python 中操作权限列表时使用 set。使用 SQL 直接编辑权限的可能性很小。那么这是一个好的设计思路吗?

我们使用 SQLAlchemy 作为 ORM,所以它很可能用 PickleType 列来实现。我不打算存储整个 pickle 的“资源”记录集,只存储由“资源”主键​​值组成的 set 对象。

最佳答案

如果你要 pickle 集,你应该找到一个好的对象数据库(比如 ZODB )。在纯关系世界中,您的集合存储为 BLOBS,效果很好。尝试在 ORM 情况下对集合进行 pickle 可能会导致 ORM 映射出现混淆问题,因为它们大多假设没有任何必须解码的 BLOB 的纯关系映射。

集合和其他一等对象实际上属于数据库。 ORM 是一个 hack,因为有些人认为关系数据库“更好”,所以我们 hack 了一个映射层。

使用对象数据库,您会发现事情通常要顺利得多。


编辑

SQLAlchemy 有它自己的序列化器。

http://www.sqlalchemy.org/docs/05/reference/ext/serializer.html

这既不是 pickle 也不是 cPickle。但是,因为它需要可扩展,所以它会表现得像 pickle。哪一个——为了你的目的——将和你需要的一样快。您不会一直反序列化 ACL。

关于python - 使用Python集合类型实现ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/790613/

相关文章:

python - 如何更快地实现贪心集覆盖?

python - 配置 SCons 以使用单独的工具进行代码生成和汇编

python - 为什么不应该将重复对象添加到我的 Python 集中?

c++ - C++ STL set_symmetry_difference 的正确用法?

acl - 如何将IP地址添加到squid的白名单

python - numpy.view给定valueError

python - 在没有python的电脑上运行程序

javascript - 是否可以在 ES6 Set 实例上使用数组迭代方法?

networking - 如何在 Amazon Virtual Private Cloud 上设置网络 ACL?

C# 本地共享的文件/目录权限