2011-06-21 2 views
1

私は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を使用してもフィールドを追加しません。 EDIT2obj.setTitleのようなデフォルトのプロセッサを使用して編集することは可能です。私は現在、このアプローチを使用しており、完璧に動作します。

+0

副作用は、あなたがそれを使用することを計画している方法によって異なります。どのユーザーでもコンテンツをどこにでも作成できるようにしたいだけではないと確信しています...これは、他のユーザーがリスクの内容を理解しやすくするために役立ちます。 – vangheem

+0

@vangheem:ユーザーは、特定のコンテキストのどこにでもコンテンツを作成するつもりはありません。このシナリオでnewSecurityManagerを使用してリスクを探しています。 –

答えて

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

+0

「オブジェクトを作成する際のセキュリティをバイパスする」を検索する:http://plone.org/documentation/manual/plone-community-developer-documentation/content/creating#bypassing-permissions-when-creating-content-アイテムこれらは*多くのシンプルな解決策のようです。どう思いますか? (そして、ヒントのためにありがとう、私は "バイパスセキュリティ"を検索することについて考えていない:P) –

+0

Yah、それは私がここに入れたものとほとんど同じです。 Ploneの特定のバージョンでは、_finishConstructionメソッドも発行する必要があります。 – vangheem

+0

私は '_createObjectByType'を読むためにいくつかのgrepを実行し、' return fti._finishConstruction(ob) 'をすでに返しています。 Plone 4では、_finishConstructionはもう必要ではないことがわかりました。 Plone 4であなたの例のように_finishConstructionを呼び出すと、エラーがスローされますか? –

関連する問題