使用Python集类型实现ACL

时间:2009-04-26 10:37:33

标签: python set acl pickle

目前我有以下表格:Pages, Groups, GroupPage, Users, UserGroup。使用pickle set我只需要3个表就可以实现相同的功能:Pages, Groups, Users

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

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

我们将SQLAlchemy用作ORM,因此可能会使用PickleType列实现。我不打算存储整个pickled“资源”记录集,只存储由“资源”主键​​值构成的set对象。

4 个答案:

答案 0 :(得分:3)

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

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

使用对象数据库,你会发现事情往往更顺畅。


修改

SQLAlchemy拥有自己的序列化程序。

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

这既不是泡菜也不是cPickle。但是,因为它需要是可扩展的,所以它的行为就像pickle。哪个 - 为了您的目的 - 将根据您的需要尽快。您不会一直反序列化ACL。

答案 1 :(得分:2)

您需要考虑DBMS为您提供的内容,以及您需要重新实现哪些功能。 并发问题很重要。有一些竞争条件需要考虑(例如在不同的线程和进程中发生多次写入并覆盖新数据),性能问题(编写策略?如果您的进程崩溃并丢失数据怎么办?),内存问题(你的权限集有多大?这一切都适合RAM吗?)。

如果你有足够的内存并且你不必担心并发性,那么你的解决方案可能是一个很好的解决方案。否则我会坚持使用数据库 - 它会为您解决这些问题,并且已经进行了大量工作以确保它们始终将您的数据从一个一致状态转移到另一个状态。

答案 2 :(得分:2)

我,我坚持在关系数据库中保持持久性信息,其形式独立于用于访问它的特定编程语言 - 就像我喜欢Python一样(那是很多 ),有一天我可能想从其他语言访问这些信息,如果我选择了特定于Python的格式......那么我会后悔... ...

答案 3 :(得分:1)

如果它简化了事情并且你不会编辑很多文件(或者不经常编辑),我会说它去做。当然,要考虑的第三个选择是使用sqlite数据库来存储这些东西。有一些工具可以使这些易于阅读。