gpt4 book ai didi

python - 没有遍历的 Pyramid ACL

转载 作者:太空狗 更新时间:2023-10-29 20:26:17 32 4
gpt4 key购买 nike

我真的不知道 ACL 是如何工作的。我知道这很酷,可以节省我很多时间和痛苦。但目前我有点迷路了。 Pyramid 的所有示例都使用遍历。我专门使用 URL Dispatch。我不确定如何构建资源树结构。

这是一个代码示例:

class QuestionFactory(object):

def __init__(self, request):
self.__acl__ = default[:]
self.uid = authenticated_userid(request)

self.qid = request.matchdict.get('id')
if self.qid:
self.question = request.db.questions.find_one({'_id': ObjectId(self.qid)})
if str(self.question.get('owner')) == self.uid:
self.__acl__.append((Allow, userid, 'view'))

事实是,它有效。但我必须为每种类型的资源定义一个新工厂。我不确定我应该如何知道我正在尝试通过 URL Dispatch 和 Factory 访问哪个资源。我会看到类似的东西

/accounts/{account}   //Owners only but viewable by anyone 
/messages/{message} //Owners only
/configs/{config} //Admin only
/pages/{page} //Admins only but viewable by anyone

这里说我会有这样的结构

  Root -\
+-- account
+-- message
+-- config
+-- page

这些工厂中的每一个都有自己的特殊 acl。另一件事是/accounts 是主页。它没有 id 或任何东西。另外/accounts/new 也是一个特例。它不是一个 id,而是创建一个新项目的 View 。

我正在使用具有 GET/PUT/DELETE/POST 要求的 Restful 风格。我不太确定我应该如何自动将 url 与资源和正确的 acl 匹配。如果我在根目录中定义一个像上面那样的特殊工厂,就没有问题。

编辑

我确实让它工作了,但有些事情除外。我终于明白遍历的目的是什么了。例如我们有那个 url:/comments/9494f0eda/new,/评论/{评论}/新

我们可能必须在我们的资源树中添加节点,甚至 3 个节点。

RootFactory 将首先被检查,然后根据我们的遍历。它将获取 RootFactory 的注释属性,然后是注释工厂的“注释”和 CommentFactory 或对象本身的“新建”

我没有像 Michael 的例子那样使用 Factory as dict

看起来很像:

class RessourceFactory(object):
def __init__(self, parent, name):

self.__acl__ = []
self.__name__ = name
self.__parent__ = parent

self.uid = parent.uid
self.locale = parent.locale
self.db = parent.db
self.req = parent.req

这是我的基本资源对象。在每个步骤中,它都会将信息从父级复制到新子级。我当然可以冒泡我的属性。上下文。parent._parent_.uid 但那是只是没那么好。

我没有使用 dict 属性的原因。我添加以使其适用于

/评论

由于某些原因,它确实创建了我的 CommentFactory 但没有返回它,因为不需要 key 。

所以我的根工厂看起来像这样:

class RootFactory(object):

def __init__(self, request):
self.__acl__ = default[:]

self.req = request
self.db = request.db

self.uid = authenticated_userid(request)
self.locale = request.params.get('locale', 'en')

def __getitem__(self, key):

if key == 'questions':
return QuestionFactory(self, 'questions')
elif key == 'pages':
return PageFactory(self, 'pages')
elif key == 'configs':
return ConfigFactory(self, 'configs')
elif key == 'accounts':
return AccountFactory(self, 'accounts')

return self

如果没有找到,RootFactory 返回它自己,如果没有,它返回一个新的工厂。由于我的代码基于 Michael 的代码,因此 Factory 构造函数有第二个参数。我不确定是否保留它,因为 QuestionFactory 很清楚如何处理“问题”,因此无需在此处命名工厂。它应该已经知道它的名字了。

class QuestionFactory(RessourceFactory):
def __init__(self, parent, name):
RessourceFactory.__init__(self, parent, name)
self.__acl__.append((Allow, 'g:admin', 'view'))
self.__acl__.append((Allow, 'g:admin', 'edit'))
self.__acl__.append((Allow, 'g:admin', 'create'))
self.__acl__.append((Allow, 'g:admin', 'delete'))
self.__acl__.append((Allow, Everyone, 'create'))

def __getitem__(self, key):

if key=='read':
return self

self.qid = key
self.question = self.db.questions.find_one({'_id': ObjectId(self.qid)})

if str(self.question.get('owner')) == self.uid:
log.info('Allowd user %s' % self.uid)
self.__acl__.append((Allow, self.uid, 'view'))
self.__acl__.append((Allow, self.uid, 'edit'))
self.__acl__.append((Allow, self.uid, 'delete'))

return self

这就是几乎所有逻辑的去向。在 init 中,我在 getitem 中设置了适用于/questions 的 acl,它将适用于/questions/{id}/*

由于我返回了它自己,任何经过这个 RessourceFactory 的 getitem 都将指向它自己,除非我为某些特殊情况返回一个新工厂。这样做的原因是我的上下文不仅仅是数据库中的对象或对象。

我的上下文处理多种事情,例如用户 ID、区域设置等...完成 acl 后,我就有了一个新的上下文对象可供使用。它删除了 View 中的大部分逻辑。

我或许可以设置事件来查询区域设置和用户标识,但它确实适合这里。如果我需要任何新东西,我只需编辑我的 RootFactory 和 RessourceFactory 以将它们复制到子工厂。

这样,如果必须在所有 View 中更改某些内容,则根本没有冗余。

最佳答案

您似乎对某些对象/行级安全功能感兴趣,这些功能仅允许帐户所有者查看他们的数据。我会向您推荐我之前关于这个主题的 SO 答案,以及我一直在为 URL Dispatch 中的 auth 编写的教程,它是围绕这个答案构建的。具体来说,您可能想查看链接的 github 项目中的 2.object_security 演示,以及在我的网站上将资源树解释为渲染 html 的一部分的文档。

Pyramid authorization for stored items

https://github.com/mmerickel/pyramid_auth_demo

http://michael.merickel.org/projects/pyramid_auth_demo/

如果您对理解这些资源有任何疑问,我很乐意在这里进一步阐述。

关于python - 没有遍历的 Pyramid ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880022/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com