Plone 4: ограничение публикуемого контента - PullRequest
6 голосов
/ 12 марта 2012

При установке Plone 4.x можно либо ограничить опубликованный контент

  1. определенным пользователем / группой, либо создать частный контент
  2. для отображения в меню и поискане залогиненные пользователи?

У меня есть клиент, который хочет иметь контент, который может быть просмотрен только определенным пользователем / группой, но будет отображаться в меню или поиске, когда он не вошел в систему.

Каков наилучший подход для достижения этой функциональности?

1 Ответ

7 голосов
/ 12 марта 2012

Вам нужно настроить рабочий процесс, как показано ниже:

  • перейдите в интерфейс управления Zope-> portal_workflow
  • Создайте новое состояние, скажем, "Трейлер" (это необязательно, вместо этого вы можете настроить существующее состояние ... возможно, закрытое состояние будет хорошим вариантом для работы с ограничениями для определенных пользователей / групп)
  • Удалить все разрешения, кроме «Доступ к информации о содержимом», от анонимного пользователя в этом конкретном состоянии.
  • Нажмите кнопку «Обновить настройки безопасности»

Готово! Теперь все содержимое в состоянии «Трейлер» будет доступно для поиска, но не будет доступно для просмотра анонимным пользователям.

Примечание: если вы решите создать новое состояние, как я советую, обязательно добавьте также все необходимые переходы.

Редактировать

К сожалению, я не знал, что в последних версиях Plone есть новый индекс в portal_catalog ( allowRolesAndUsers ), который не позволяет вышеуказанному процессу работать так, как раньше. Вышеописанный процесс все еще корректен, хотя вам необходимо переопределить индексатор по умолчанию. Сначала создайте новый пакет с 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:

eggs =
        my.package

develop =
        src/my.package

Rerun buildout. Вот и все.

...