Вам нужно настроить рабочий процесс, как показано ниже:
- перейдите в интерфейс управления 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. Вот и все.