- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我真的不知道 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/
Pyramid 项目中有一个 development.ini 或 production.ini 。我将自己的配置数据添加到 ini 文件如: [thrift] host = 0.0.0.0 port
我想注册一个请求处理程序,但不想使用扫描方法。 为什么我需要调用两个方法(add_route 和 add_view)而不是一个? from wsgiref.simple_server import m
请问我错过了什么。当我想提供已下载到磁盘上的视频文件时,我不断在浏览器中收到内部服务器错误。这是我的代码: View 函数 @view_config(name='download_video') de
请问我错过了什么。当我想提供已下载到磁盘上的视频文件时,我不断在浏览器中收到内部服务器错误。这是我的代码: View 函数 @view_config(name='download_video') de
我目前正在学习如何使用 Python Pyramid Web 框架,并且发现文档非常出色。 然而,在区分“模型”(即在 SQLAlchemy 声明性系统下定义的类)的概念和“资源”(即定义访问控制的方
我一直在尝试让 Pyramid 在谷歌应用程序引擎中运行,但没有成功。我尝试按照说明 here 进行操作但它似乎已经过时了,因为 gae 不再有 appcfg.py 了。我按照应用程序引擎文档中的 F
大多数可用教程都展示了如何使用上游 HTTP 服务器(如 NGINX)设置 uWSGI。但是 uWSGI 本身就可以完美地充当路由器/代理/负载均衡器 - 请参阅 this对于我的项目,我现在不想设置
我正在尝试使用 Pyramid 自省(introspection)接口(interface)从可调用 View 中获取给定资源类型的所有 View 的列表。我可以使用以下方法获取一组已添加的 View
我正在使用 Pyramid 来创建网络应用程序。然后我使用 Pyramid 烧杯将烧杯连接到 Pyramid 的 session 管理系统。 有两个值会影响用户 session 的持续时间。 sess
背景 我对 unicode 和 Python 真是一团糟。这似乎是一个普遍的焦虑,我尝试过使用其他解决方案,但我就是无法解决这个问题。 设置 MySQL 数据库设置 collation_datab
模型 - View - PHP 框架(如 Kohana)的 Controller 的 Pyramid/Python 等价物是什么? In Pyramid "Model" is .... and it
我遵循了 http://docs.pylonsproject.org/docs/pyramid/en/latest/tutorials/wiki/index.html 上的教程 我知道,当我添加或更改
我使用 yapps 为 Pyramid 内的 LaTex 语言生成解析器(例如将 \begin{itemize} 之类的内容翻译成相应的 -Tags)。一个命令(即 \ref{SOMEID} )应该
我正在 Pyramid 框架之上使用 python 制作 webapps。 在我利用 Mechanize 进行一些简单网页抓取的函数之一中,当我将其作为独立的 Python 脚本运行并通过 Pyram
var z = []; for(var i = 1; i len) z.push("a".repeat(len-i%len)) console.log(z.join("\n")); 关于jav
我正在开发 Python Pyramid我需要使用rest api,在其中一个请求中,我需要处理一个excel,对于它的每一行,我都会获取GPS坐标并进行大量验证,这意味着这个唯一的请求可能需要大约1
这是我的 base.html: {% block head %} {% endblock %} {% block body
我一直在尝试使用 Pyramid 框架制作带有复选框和单选按钮的表单,但我不知道如何正确执行。 我正在使用pyramid_simpleform。到目前为止,我已经能够使用 for 循环将复选框放在表单
我按照 Pyramid 教程进行操作,一切正常。然后我为 Pyramid 安装了 jinja2,并将必要的代码行添加到我的 development.ini 文件中。按预期在指定位置找到了我的模板。它们
我的应用程序从用户接收一个或多个 URL(通常为 3-4 个 URL),从这些 URL 中抓取某些数据并将这些数据写入数据库。但是,因为抓取这些数据需要一点时间,所以我正在考虑在单独的线程中运行每个抓
我是一名优秀的程序员,十分优秀!