Python 使用自定义工作流访问门户内容,无';视图';权限

Python 使用自定义工作流访问门户内容,无';视图';权限,python,plone,zodb,Python,Plone,Zodb,我有一个问题,我需要能够让匿名用户通过门户目录搜索和检索自定义内容,但他们无法查看 我使用了自定义内容类型和自定义工作流,我得到的很可能是权限问题。我通过ZMI->portal_工作流定义了一个自定义工作流,然后将其作为XML定义导出到源代码中。我将匿名用户的权限设置为“访问内容信息”,而不是“查看”。请注意,代码段中的“活动”是已启用该权限的工作流状态-- Brain lookup适用于“经理”角色,但当该角色切换到“匿名”时,catalog返回一个空列表 import unittest2 a

我有一个问题,我需要能够让匿名用户通过门户目录搜索和检索自定义内容,但他们无法查看

我使用了自定义内容类型和自定义工作流,我得到的很可能是权限问题。我通过ZMI->portal_工作流定义了一个自定义工作流,然后将其作为XML定义导出到源代码中。我将匿名用户的权限设置为“访问内容信息”,而不是“查看”。请注意,代码段中的“活动”是已启用该权限的工作流状态--

Brain lookup适用于“经理”角色,但当该角色切换到“匿名”时,catalog返回一个空列表

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)
有没有办法在不大幅修改权限的情况下修复此问题

使用UnlimitedSearchResults似乎可以修复搜索,但每当我尝试在大脑上运行“getObject”时,就会出现以下错误:

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

您的
active
状态需要将查看权限授予Anonymous。目前仅限于以下角色:


经理
所有者
审核人
销售代表
网站管理员
如果没有查看权限,“匿名者”即使在给定“活动”状态下也无法查看您的对象,该用户也无法在目录中找到这些对象

您可以使用目录的
.unstructedSearchResults()
方法覆盖目录的此行为:

lookup1 = self.catalog.unrestrictedSearchResults(
    portal_type='SalesProduct', Title='Product 1', review_state='active')
无法从受限代码中使用此方法

匿名用户完全可以访问返回的brain对象,但不能对其使用
getObject()
方法,因为这将使用当前用户的权限来遍历它。如果您需要从大脑获取实际对象,那么还有一种特殊的、私有的方法可以不受这些限制地获取实际对象,称为
\u unrestrictedGetObject()


同样,此方法仅对不受限制的代码可用。

您的
活动状态需要将查看权限授予Anonymous。目前仅限于以下角色:


经理
所有者
审核人
销售代表
网站管理员
如果没有查看权限,“匿名者”即使在给定“活动”状态下也无法查看您的对象,该用户也无法在目录中找到这些对象

您可以使用目录的
.unstructedSearchResults()
方法覆盖目录的此行为:

lookup1 = self.catalog.unrestrictedSearchResults(
    portal_type='SalesProduct', Title='Product 1', review_state='active')
无法从受限代码中使用此方法

匿名用户完全可以访问返回的brain对象,但不能对其使用
getObject()
方法,因为这将使用当前用户的权限来遍历它。如果您需要从大脑获取实际对象,那么还有一种特殊的、私有的方法可以不受这些限制地获取实际对象,称为
\u unrestrictedGetObject()



同样,这种方法只适用于不受限制的代码。

这毫无意义;没有代码可以根据访问级别更改目录模式值。这里还有其他错误(可能是事务提交)?好的,我犯了一个错误,当我匿名搜索时,没有返回任何内容。因此,即使在
'active'
状态下,匿名用户也不允许看到该对象。这听起来像是一种可能但正常的状态;检查您的工作流程,检查您的工作流程和权限是否在测试期间正确设置,等等。如果没有自定义工作流程等,此处将没有任何帮助。我已将自定义工作流程附加到帖子中。基本上我既可以查看对象,也可以从门户目录中查找,或者两者都不做。这篇文章也有类似的问题,但它主要涉及索引——这毫无意义;没有代码可以根据访问级别更改目录模式值。这里还有其他错误(可能是事务提交)?好的,我犯了一个错误,当我匿名搜索时,没有返回任何内容。因此,即使在
'active'
状态下,匿名用户也不允许看到该对象。这听起来像是一种可能但正常的状态;检查您的工作流程,检查您的工作流程和权限是否在测试期间正确设置,等等。如果没有自定义工作流程等,此处将没有任何帮助。我已将自定义工作流程附加到帖子中。基本上我既可以查看对象,也可以从门户目录中查找,或者两者都不做。这篇文章也有类似的问题,但它主要涉及索引——但如果我授予“查看”权限,匿名用户将能够从浏览器中查看对象,我想阻止这种情况。我只希望anonymous能够在特定情况下从特定视图查看对象。@AlexVolkov:更新了答案,添加了如何告知目录不要在查看权限上进行筛选的内容。我尝试过,看到更新的答案,我确实从该查询中获得结果,但每当我尝试对结果运行getObject时,我犯了“未经授权”的错误。@AlexVolkov:你在这个问题上一直在扩展,不是吗?:-)我对此感到内疚。我只是想让这件事顺利进行。我应该称之为“工作流权限问题”之类的。当问题发生在其他地方时,具体化并没有帮助。但如果我授予“查看”权限,匿名用户将能够从浏览器中查看对象,我希望阻止这种情况。我只希望anonymous能够在特定情况下从特定视图查看对象。@AlexVolkov:更新了答案,添加了如何告知目录不要在查看权限上进行筛选的内容。我尝试过,看到更新的答案,我确实从该查询中获得结果,但每当我尝试对结果运行getObject时,我犯了“未经授权”的错误。@AlexVolkov:你在这个问题上一直在扩展,不是吗?:-)我对此感到内疚。我只是想让这件事顺利进行。