Я встречал эту маленькую функцию , которая позволяет анонимным пользователям вызывать фабрику вызовов.
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
. Я сейчас использую этот подход, и он работает без нареканий.