Plone 4.2 formwidget内容树权限

Plone 4.2 formwidget内容树权限,plone,Plone,我在Plone 4.2.4中有一个灵巧的内容类型,它使用contenttree小部件来管理引用的对象,但只在editForm中 我意识到,引用的项目必须是外部可见的,才能通过小部件显示,这意味着匿名用户可以查看和访问内容信息。那不是我想要的。因此,我挖掘了contenttree小部件的源代码,并将以下内容添加到我的产品browser/configure.zcml <include package="Products.CMFCore" file="permissions.zcml"

我在Plone 4.2.4中有一个灵巧的内容类型,它使用contenttree小部件来管理引用的对象,但只在editForm中

我意识到,引用的项目必须是
外部可见的
,才能通过小部件显示,这意味着匿名用户可以
查看
访问内容信息
。那不是我想要的。因此,我挖掘了contenttree小部件的源代码,并将以下内容添加到我的产品
browser/configure.zcml

<include package="Products.CMFCore" file="permissions.zcml"
         zcml:condition="installed plone.app.upgrade" />

<browser:page
    for="*"
    name="contenttree-fetch"
    class="my.product.content.bikemetamodel.EditForm"
    permission="cmf.ModifyPortalContent"
    />
<adapter factory="my.product.browser.widgets.MetamodellContenttreeAdapter" />
但这似乎还不够。如果权限设置为拒绝匿名用户查看和访问内容信息,则基础目录搜索不会返回任何结果。所以我想,我必须使用查看权限来构造某种代理用户


在新创建的视图中使用
SecurityManager
以其他用户的身份获取结果,可以吗?还是我遗漏了什么?

好吧,下面是我如何解开这个谜团的

经过一段时间的深入研究,我意识到我以前的想法没有抓住重点,即覆盖
@@contenttree fetch
视图。我提出的解决方案非常简单,对我来说似乎很优雅(足够)。我现在做一个sudo风格的小步,收集所需的项目

Class编辑表单(dextrity.EditForm):
grok.context(IBikeMetaModel)
#如果它不是编辑视图,我们可以管理它
#这里有许可证。在编辑视图中不必要,因为
#在此内容类型*.xml计数中定义的编辑权限
#集团要求(“cmf.ModifyPortalContent”)
@财产
def acl_用户(自身):
返回getToolByName(getSite(),'acl\u users')
def updateWidgets(自我):
#这就是魔法。sudo风格的用户侧步
#具有收集权限的id“system”
#的updateWidgets函数中所需的列表
#基层
proxy\u user=self.acl\u users.getUserById(“系统”)
oUser=getSecurityManager()
newSecurityManager(self.request,代理用户)
super(EditForm,self).updateWidgets()
#自定义小部件更新
self.widgets['title'].mode=显示模式
self.widgets['year'].mode=隐藏模式
self.widgets['brand'].mode=隐藏模式
self.widgets['model'].mode=隐藏模式
#非常重要!切换回原始用户。
设置安全管理器(USER)
class MetamodellContenttreeAdapter(object):
    implements(IBikeMetaModel)
    adapts(Interface)

def __init__(self, context):
    self.context = context

def _get_allowed_modeltypes(self):
    return None

def _set_allowed_modeltypes(self, value):
    print "setting", value

allowed_modeltypes = property(_get_allowed_modeltypes, _set_allowed_modeltypes)    

[...]