1

匿名ユーザーがportal_catalogを介して検索および取得できるようにカスタムコンテンツにアクセスできるようにする必要があるが、ユーザーには表示できないようにする必要があるという問題があります。

カスタムコンテンツタイプとカスタムワークフローを使用しましたが、取得しているのはおそらくアクセス許可の問題です。ZMI-> portal_workflowを使用してカスタムワークフローを定義し、それをXML定義としてソースコードにエクスポートしました。匿名ユーザーのアクセス許可を「コンテンツ情報へのアクセス」として設定しましたが、「表示」としては設定していません。コードスニペットの「アクティブ」は、その権限が有効になっているワークフロー状態であることに注意してください--sales_workflow

ブレインルックアップは「Manager」ロールに対して機能しますが、ロールが「Anonymous」に切り替えられると、カタログは空のリストを返します。

import unittest2 as unittest


from . import INTEGRATION_TESTING
from AccessControl import getSecurityManager

from plone.app.testing import setRoles, logout
from plone.app.testing import TEST_USER_ID

from Products.CMFCore.utils import getToolByName

def drop_to_anonymous(self):
    """
    Drop site roles to anonymous user only.
    Note this is a class method and not a function
    assign this method as a class member and then call it
    """
    logout()
    setRoles(self.portal, TEST_USER_ID, ['Anonymous'])
    user = getSecurityManager().getUser()
    roles =  user.getRolesInContext(self.portal)
    self.assertListEqual(['Anonymous'], roles)

class TestSalesRepWorkflow(unittest.TestCase):
    layer = INTEGRATION_TESTING
    drop_to_anonymous = drop_to_anonymous
    def setUp(self):
        self.portal = self.layer['portal']
        self.wftool = getToolByName(self.portal, 'portal_workflow')
        self.catalog = getToolByName(self.portal, 'portal_catalog')
    def test_workflow_lookup_anon(self):
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        self.portal.invokeFactory(
                                'CustomProduct',
                                'prod1',
                                title="Product 1"
                                )
        prod1 = self.portal['prod1']
        self.wftool.doActionFor(prod1, action='activate')
        review_state = self.wftool.getInfoFor(prod1, 'review_state')
        prod1.reindexObject()
        self.assertEqual('active', review_state)
        lookup = self.catalog(portal_type='CustomProduct', Title='Product 1',
                            review_state='active')
        #This test passes with managerial permissions
        self.assertEqual(len(lookup), 1)
        #Repeat the same test in 'Anonymous' role
        self.drop_to_anonymous()
        lookup1 = self.catalog(portal_type='CustomProduct', Title='Product 1',
                            review_state='active')
        #When dropped to anonymous role, the test fails, 
        #lookup returns an empty list
        self.assertEqual(len(lookup1), 1)

権限を大幅に変更せずにこれを修正する方法はありますか?

unrestrictedSearchResultsを使用すると検索が修正されるようですが、ブレインで「getObject」を実行しようとすると、次のエラーが発生します。

Unauthorized: You are not allowed to access 'XXX' in this context
4

1 に答える 1

1

あなたのactive州は、匿名に表示権限を与える必要があります。現在、次の役割に制限されています。

<state state_id="active" title="">
 <!-- other information elided here --> 
 <permission-map name="View" acquired="False">
   <permission-role>Manager</permission-role>
   <permission-role>Owner</permission-role>
   <permission-role>Reviewer</permission-role>
   <permission-role>SalesRep</permission-role>
   <permission-role>Site Administrator</permission-role>
  </permission-map>

表示権限がないと、匿名は、active状態が指定されている場合でもオブジェクトを表示できず、そのユーザーがカタログでオブジェクトを見つけることもできません。

.unrestrictedSearchResults()カタログのメソッドを使用して、カタログのこの動作をオーバーライドできます。

lookup1 = self.catalog.unrestrictedSearchResults(
    portal_type='SalesProduct', Title='Product 1', review_state='active')

このメソッドは、制限されたコードからは使用できません。

getObject()返されたブレインオブジェクトは、匿名ユーザーが完全にアクセスできますが、現在のユーザーのアクセス許可を使用してトラバースするため、メソッドを使用することはできません。脳から実際のオブジェクトを取得する必要がある場合は、これらの制限なしで実際のオブジェクトを取得するための特別なプライベートメソッドがあります._unrestrictedGetObject()

obj = brain._unrestrictedGetObject()

この方法も、制限のないコードでのみ使用できます。

于 2013-01-22T22:27:07.717 に答える