匿名用户创建内容类型:可以使用哪种方法而不是invokeFactory?

时间:2011-06-21 17:01:36

标签: plone

我遇到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等默认附件进行编辑。我现在正在使用这种方法,它完美无缺。

1 个答案:

答案 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

来源:uwosh.pfg.d2c