私はthis little functionを訪れ、匿名ユーザーがinvoke factoryを呼び出せるようにしました。コンテンツタイプを作成する匿名ユーザー:invokeFactoryではなく、どのアプローチを使用できますか?
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
のようなデフォルトのプロセッサを使用して編集することは可能です。私は現在、このアプローチを使用しており、完璧に動作します。
副作用は、あなたがそれを使用することを計画している方法によって異なります。どのユーザーでもコンテンツをどこにでも作成できるようにしたいだけではないと確信しています...これは、他のユーザーがリスクの内容を理解しやすくするために役立ちます。 – vangheem
@vangheem:ユーザーは、特定のコンテキストのどこにでもコンテンツを作成するつもりはありません。このシナリオでnewSecurityManagerを使用してリスクを探しています。 –