在Plone 4中重新定义浏览器视图的安全性

在Plone 4中重新定义浏览器视图的安全性,plone,zope,Plone,Zope,我想重新定义stock folder_contents browser视图的安全性,以便只有具有审阅者角色的成员才能访问它 该类在plone.app.content.browser.foldercontents.FolderContentsView中定义 在我的custom.policy产品中 浏览器/configure.zcml: <configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http:

我想重新定义stock folder_contents browser视图的安全性,以便只有具有审阅者角色的成员才能访问它

该类在plone.app.content.browser.foldercontents.FolderContentsView中定义

在我的custom.policy产品中

浏览器/configure.zcml:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:browser="http://namespaces.zope.org/browser"
    i18n_domain="custom.policy">

  <browser:page
    for="*"
    class=".overrides.FolderContentsView"
    name="folder_contents"
    template="folder_contents.pt"
    permission="cmf.ReviewPortalContent" 
    />

</configure>
但是,当我启动实例时,我得到:

zope.configuration.config.ConfigurationConflictError: Conflicting configuration actions
For: ('view', None, u'folder_contents', <InterfaceClass zope.publisher.interfaces.browser.IBrowserRequest>, <InterfaceClass zope.publisher.interfaces.browser.IDefaultBrowserLayer>)
File "src/custom.policy/custom/policy/browser/configure.zcml", line 30.2-36.6
    <browser:page
      for="*"
      class=".overrides.FolderContentsView"
      name="folder_contents"
      template="folder_contents.pt"
      permission="cmf.ReviewPortalContent"
      />
File "eggs/plone.app.content-2.0.7-py2.6.egg/plone/app/content/browser/configure.zcml", line 15.4-20.46
      <browser:page
          for="*"
          class=".foldercontents.FolderContentsView"
          name="folder_contents"
          template="folder_contents.pt"
          permission="cmf.ListFolderContents" />
zope.configuration.config.ConfigurationConflictError:配置操作冲突
用于:(“查看”,无,u“文件夹内容”)
文件“src/custom.policy/custom/policy/browser/configure.zcml”,第30.2-36.6行
文件“eggs/plone.app.content-2.0.7-py2.6.egg/plone/app/content/browser/configure.zcml”,第15.4-20.46行

如何在发生冲突的情况下完成此覆盖?

为更具体的接口注册它。改为说zope.interface.interface或Products.Archetypes.interfaces.IBaseContent。

您是否尝试过指定自定义浏览器层?

如果这只是自定义站点配置,而不是您将要构建的内容,那么overrides.zcml正是用于此目的。创建自定义/policy/overrides.zcml:

<configure xmlns="http://namespaces.zope.org/zope">
  <include package=".browser" file="overrides.zcml" />
</configure>


然后将浏览器/configure.zcml重命名为browser/overrides.zcml。

我这样做了,没有出现冲突错误,但未获取安全性重新定义(我可以作为非特权成员访问视图)。您注册的界面是什么?可能是“*”在引擎盖下使用zope.interface.interface;没有冲突,但您的注册可能会被忽略。以这种方式定义时,它会工作!搞什么鬼?使用overrides.zcml而不是configure.zcml来实现这类覆盖有什么神奇之处吗?哇,我真的找不到任何overrides.zcml的文档,这太糟糕了。无论如何,ZCML通常会跟踪将要执行的操作,如果它们发生冲突,则会将其视为错误。overrides.zcml文件是一种约定,这些文件中的操作将被加载,并允许与现有注册冲突并优先于现有注册。这是一种定制单个站点的方法,而不必做“正确的事情”,并使操作更加具体。因此,我的警告是,如果你不打算在上面建造任何东西,你可以这样做。
<configure xmlns="http://namespaces.zope.org/zope">
  <include package=".browser" file="overrides.zcml" />
</configure>