Анонимные пользователи, создающие типы контента: какие подходы можно использовать вместо invokeFactory? - PullRequest
1 голос
/ 21 июня 2011

Я встречал эту маленькую функцию , которая позволяет анонимным пользователям вызывать фабрику вызовов.

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. Но я нигде не видел этот маленький фрагмент, кроме этой заметки - это безопасно? Какие недостатки вы видите в этом подходе? РЕДАКТИРОВАТЬ : Я нашел сейчас в официальном сообществе plone docs некоторые ссылки.

Мой сценарий: анонимный пользователь создает объект Archetype в ZODB, только в определенном контексте, который принимает только этот тип объекта. Он не может видеть никаких объектов, он просто вызывает форму, которая собирается создать эти объекты. Эти объекты будут созданы, и их атрибуты (поля) также должны быть заполнены. Подход _createObjectType создает объект, но не добавляет поля, даже используя **kwargs. РЕДАКТИРОВАТЬ2 : редактировать можно по умолчанию, например, obj.setTitle. Я сейчас использую этот подход, и он работает без нареканий.

1 Ответ

4 голосов
/ 22 июня 2011

Я бы устал от использования всего, что настраивает нового менеджера безопасности.Лучший способ сделать это - обойти защиту при создании объекта.

Вы можете сделать что-то вроде:

        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

source: uwosh.pfg.d2c

...