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

Rig*_*ala 4 zope plone

我想重新定义stock folder_contents浏览器View的安全性,以便只有具有Reviewer角色的成员才能访问它.

该类在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>
Run Code Online (Sandbox Code Playgroud)

在browser/overrides.py中

from plone.app.content.browser.foldercontents import FolderContentsView

class ProtectedFolderContentsView(FolderContentsView):
    """ Customized FolderContentsView """
Run Code Online (Sandbox Code Playgroud)

但是,当我启动实例时,我得到:

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" />
Run Code Online (Sandbox Code Playgroud)

如何通过遇到冲突来完成此覆盖?

Ros*_*son 5

如果这真的只是自定义站点配置而不是你将要构建的东西,那么这正是overrides.zcml的用途.创建自定义/ policy/overrides.zcml:

<configure xmlns="http://namespaces.zope.org/zope">
  <include package=".browser" file="overrides.zcml" />
</configure>
Run Code Online (Sandbox Code Playgroud)

然后将您的browser/configure.zcml重命名为browser/overrides.zcml.

  • 哇,我真的找不到任何关于overrides.zcml的文档,这真的很糟糕.无论如何,ZCML通常会跟踪将要执行的操作,如果它们发生冲突则认为它是错误的.overrides.zcml文件是一种约定,这些文件中的操作被加载并允许与现有注册冲突并优先于现有注册.它意味着一种自定义单个网站的方式,而不必做"正确的事情",并实际上使行动更具体.因此我要谨慎,你可以这样做*如果*你不打算在它上面构建任何东西. (2认同)