【问题标题】:Plone 4: restricting published contentPlone 4:限制发布的内容
【发布时间】:2012-03-17 04:52:54
【问题描述】:

在安装 Plone 4.x 时,可以

  1. 发布的内容仅限于某个用户/组或
  2. 在菜单中显示私人内容并搜索未登录的用户?

我有一位客户希望能够拥有只能由特定用户/组查看的内容,但在未登录时会显示在菜单或搜索中。

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

【问题讨论】:

  • 菜单和搜索中是否链接了“私人”内容?如果是这样,当匿名用户访问这些链接时会发生什么?
  • 'private' 内容仅显示给管理员或分配的用户或组。如果匿名用户访问链接,它会按预期重定向到登录页面。我的目标是找到一种方法让内容显示在菜单和搜索中,但在访问页面或文件夹时重定向到登录。

标签: workflow plone


【解决方案1】:

您必须按如下方式自定义您的工作流程:

  • 转到 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

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

【讨论】:

  • 我正在运行 Plone 4.1.2 并且“访问内容信息”似乎对菜单或搜索中显示的项目没有影响。只有当我检查“查看”权限时,它才会显示在菜单或搜索结果中。我尝试了自定义状态以及修改私有状态并检查匿名用户的“访问内容信息”
  • 忽略这个事实:正如 Giacomo 所说,您始终需要将“访问内容信息”保留在“视图”的相同配置中。将它们视为一种独特的许可!
  • @keul 听起来您是在说需要检查视图。如果这就是您所说的,那么这会创建与已发布相同类型的状态,这不会实现既定目标。我完全有可能误解你了。
  • 您可能正在修改另一个工作流程。我刚刚尝试过,它可以工作,私人内容显示在菜单中,当你点击它们时,你需要登录。 @keul:在这种特定情况下,解耦这两个权限是关键。
  • @Giacoma 我正在尝试使用 simple_publication_workflow。那是你用的吗?您能否描述或链接到您在私有状态上设置的权限的屏幕截图?如果我没有在某处遗漏复选框,那么肯定是其他一些插件破坏了一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多