Plone 创建内容类型的匿名用户:可以使用哪些方法代替invokeFactory?
我遇到过让匿名用户调用调用工厂的方法Plone 创建内容类型的匿名用户:可以使用哪些方法代替invokeFactory?,plone,Plone,我遇到过让匿名用户调用调用工厂的方法 security.declarePrivate('anonymousInvokeFactory') def anonymousInvokeFactory(self, container, type_name, id, REQUEST=None, *args, **kw): """ Anonymous cannot add objects with InvokeFactory, so this is a special
security.declarePrivate('anonymousInvokeFactory')
def anonymousInvokeFactory(self, container, type_name, id,
REQUEST=None, *args, **kw):
"""
Anonymous cannot add objects with InvokeFactory, so this is a
special
method to do it with. Must be called from other function to limit
possibillities of abuse.
"""
# remember original user
mtool = getToolByName(self, 'portal_membership')
originalUser = mtool.getAuthenticatedMember()
# wrap the request in new security to be able to add content
user = self.getWrappedOwner()
newSecurityManager(REQUEST, user)
container.invokeFactory(type_name, id, REQUEST=REQUEST, *args, **kw)
# set original user again
newSecurityManager(REQUEST, originalUser)
return id
我似乎非常适合使用proxyManager元数据的情况。但是除了这个可访问的条目之外,我还没有在任何地方看到这个小片段——它安全吗?这种方法有哪些缺点编辑:我现在在一些参考资料中找到了
我的场景:匿名用户正在ZODB上创建一个仅在特定上下文中接受这种类型对象的原型对象。他看不到任何对象,他只是调用一个要创建这些对象的窗体。要创建这些对象,还需要填充它们的属性(字段)。
\u createObjectType
方法创建对象,但即使使用**kwargs
也不会添加字段EDIT2:可以使用默认的acessor进行编辑,如obj.setTitle
。我现在正在使用这种方法,它工作得非常完美。我会厌倦使用任何设置新安全管理器的方法。更好的方法是在创建对象时绕过安全性
您可以执行以下操作:
pt = getToolByName(context, 'portal_types')
type_info = pt.getTypeInfo('portal_type')
ob = type_info._constructInstance(context, id)
# CMFCore compatibility
if hasattr(type_info, '_finishConstruction'):
return type_info._finishConstruction(ob)
else:
return ob
来源:我会厌倦使用任何设置新安全管理器的东西。更好的方法是在创建对象时绕过安全性 您可以执行以下操作:
pt = getToolByName(context, 'portal_types')
type_info = pt.getTypeInfo('portal_type')
ob = type_info._constructInstance(context, id)
# CMFCore compatibility
if hasattr(type_info, '_finishConstruction'):
return type_info._finishConstruction(ob)
else:
return ob
资料来源:副作用取决于你打算如何使用它。我相信你不只是想让任何用户在任何地方创建内容。。。也许这方面的一个示例用例可以帮助其他人了解风险并帮助您更好地实施。@vangheem:用户不会在任何地方创建内容,只是在特定的上下文中。我正在寻找在这种情况下使用newSecurityManager的风险。副作用取决于您计划如何使用它。我相信你不只是想让任何用户在任何地方创建内容。。。也许这方面的一个示例用例可以帮助其他人了解风险并帮助您更好地实施。@vangheem:用户不会在任何地方创建内容,只是在特定的上下文中。在这种情况下,我正在寻找使用newSecurityManager的风险。搜索“创建对象时绕过安全性”让我明白:这似乎是一个非常简单的解决方案。你怎么认为?(谢谢你的提示,我没有想过只搜索“旁路安全”:是的,这和我在这里说的差不多。唯一的区别是在Plone的某些版本中,您还需要发布_finishConstruction方法。我已经做了一些grep来读取
\u createObjectByType
,它返回返回fti。_finishConstruction(ob)
。在Plone 4中,我看到不再需要finishConstruction。如果我调用_finishConstruction,就像你在Plone 4中的例子一样,它会抛出错误吗?我可以创建内容类型,但不能编辑它们的属性。这是没有用的。根据我提供的链接中的文档,“上面的功能仅绕过内容项构造权限检查。它不会绕过对初始创建的内容设置字段值的检查。”。所以,恐怕我还需要使用我的方法。嗯,在使用\u createObjectType
之后,我可以使用obj.setTitle
等来编辑字段。这应该在文档中……搜索“创建对象时绕过安全性”让我明白:这似乎是一个非常简单的解决方案。你怎么认为?(谢谢你的提示,我没有想过只搜索“旁路安全”:是的,这和我在这里说的差不多。唯一的区别是在Plone的某些版本中,您还需要发布_finishConstruction方法。我已经做了一些grep来读取\u createObjectByType
,它返回返回fti。_finishConstruction(ob)
。在Plone 4中,我看到不再需要finishConstruction。如果我调用_finishConstruction,就像你在Plone 4中的例子一样,它会抛出错误吗?我可以创建内容类型,但不能编辑它们的属性。这是没有用的。根据我提供的链接中的文档,“上面的功能仅绕过内容项构造权限检查。它不会绕过对初始创建的内容设置字段值的检查。”。所以,恐怕我还需要使用我的方法。嗯,在使用\u createObjectType
之后,我可以使用obj.setTitle
等来编辑字段。这应该在文档中。。。