gpt4 book ai didi

python - 使用自定义工作流程访问门户内容且没有 'View' 权限

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:59 25 4
gpt4 key购买 nike

我遇到一个问题,我需要能够让匿名用户通过 Portal_catalog 访问自定义内容以供搜索和检索,但他们无法查看。

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

大脑查找适用于“经理”角色,但当角色切换为“匿名”时,目录返回空列表。

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

最佳答案

您的事件状态需要向匿名者授予查看权限。目前仅限于以下角色:

<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>

如果没有“查看”权限,即使处于“事件”状态,匿名者也无法查看您的对象,该用户也无法在目录中找到它们。

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

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

无法在受限代码中使用此方法。

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

obj = brain._unrestrictedGetObject()

此方法再次仅适用于不受限制的代码。

关于python - 使用自定义工作流程访问门户内容且没有 'View' 权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14467043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com