我遇到this little function让匿名用户调用invoke factory。
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元数据的情况,我似乎很完美。但除了这个涉嫌入口之外,我还没有看到这个小片段 - 这样安全吗?您在这种方法中可以看到哪些缺点? 编辑:我现在在official community plone docs effort找到了一些参考资料。
我的场景:匿名用户在ZODB上创建一个Archetype对象,仅在特定的上下文中,只接受这种类型的对象。他看不到任何物体,他只是在调用一个可以创建这些物体的形式。将创建这些对象,并且还需要填充它们的属性(字段)。 _createObjectType
方法创建对象,但即使使用**kwargs
也不会添加字段。 EDIT2 :可以使用obj.setTitle
等默认附件进行编辑。我现在正在使用这种方法,它完美无缺。
答案 0 :(得分:4)
我会厌倦使用任何设置新安全管理器的东西。更好的方法是在创建对象时绕过安全性。
您可以执行以下操作:
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