Plone 4:限制发布的内容

时间:2012-03-12 13:17:52

标签: workflow plone

在Plone 4.x安装上,可以

  1. 发布的内容仅限于某个用户/组或
  2. 将私人内容显示在菜单中并搜索未登录的用户?
  3. 我的客户希望能够拥有只能由特定用户/群组查看的内容,但会在未登录时显示在菜单或搜索中。

    实现此功能的最佳方法是什么?

1 个答案:

答案 0 :(得分:7)

您必须自定义工作流程,如下所示:

  • 转到Zope管理界面 - > portal_workflow
  • 创建一个新状态,让我们说“预告片”(这是可选的,您可以自定义现有状态......也许私有状态是处理特定用户/组限制的好选择)
  • 从该特定状态的匿名用户中删除所有权限,但“访问内容信息”
  • 按“更新安全设置”按钮

完成! 现在,“预告片”状态中的所有内容都是可搜索的,但匿名用户无法查看。

注意:如果您选择创建新状态,正如我所建议的那样,请务必添加所有需要的转换。

修改

不幸的是,我不知道在最近的Plone版本中,portal_catalog(allowedRolesAndUsers)中有一个新索引阻止上述过程像以前一样工作。上面的过程仍然是正确的,但您需要覆盖默认索引器。 首先create a new package with paster使用“plone”模板。然后在包的主要级别(例如my.package / my / package)中添加一个名为indexers.py的文件,其中包含:

from zope.interface import Interface
from plone.indexer.decorator import indexer
from AccessControl.PermissionRole import rolesForPermissionOn
from Products.CMFCore.utils import getToolByName
from Products.CMFCore.CatalogTool import _mergedLocalRoles

@indexer(Interface)
def allowedRolesAndUsers(obj):
    """Return a list of roles and users with View permission.

    Used by PortalCatalog to filter out items you're not allowed to see.
    """
    allowed = {}
    for r in rolesForPermissionOn('Access contents information', obj):
        allowed[r] = 1
    # shortcut roles and only index the most basic system role if the object
    # is viewable by either of those
    if 'Anonymous' in allowed:
        return ['Anonymous']
    elif 'Authenticated' in allowed:
        return ['Authenticated']
    localroles = {}
    try:
        acl_users = getToolByName(obj, 'acl_users', None)
        if acl_users is not None:
            localroles = acl_users._getAllLocalRoles(obj)
    except AttributeError:
        localroles = _mergedLocalRoles(obj)
    for user, roles in localroles.items():
        for role in roles:
            if role in allowed:
                allowed['user:' + user] = 1
    if 'Owner' in allowed:
        del allowed['Owner']
    return list(allowed.keys())

然后在同一级别添加一个文件overrides.zcml

<configure xmlns="http://namespaces.zope.org/zope">

    <adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" />

</configure>

最后,您的产品树应该如下所示:

my.package/
├── my
│   ├── __init__.py
│   └── package
│       ├── configure.zcml
│       ├── overrides.zcml
│       ├── indexers.py
│       ├── __init__.py
│       ├── profiles
│       │   └── default
│       │       └── metadata.xml
│       └── tests.py
├── README.txt
├── setup.cfg
└── setup.py

最后,您需要在buildout.cfg中包含新创建的egg:

eggs =
        my.package

develop =
        src/my.package

重新运行扩建。就是这样。