Contenuti visibili ma non accessibili in Plone 4
Mostrare che certi documenti esistono ma senza consentire l'accesso all'utente fino a che non abbia effettuato il login? Ecco come fare.
Plone su ogni oggetto gestito (pagina, notizia, cartella, etc.) mette a disposizione una fornita lista di permessi, che il manager del portale assegna ai ruoli, e quindi agli utenti, che preferisce.
Da sempre nella lista sono presenti un paio di permessi preposti ad assolvere il nostro caso d'uso:
- View: permesso che chi visita la pagina deve avere
- Access contents information: permesso che deve avere chi visualizza la pagina oggetto di una ricerca
Giocando con ruoli e permessi si riuscirebbe facilmente a ottenere il caso voluto, e quindi a mostrare ad esempio ad un utente anonimo la presenza di una pagina a sistema, mandandolo al login nel momento in cui decide di visitarla.
Questo se non fosse stato implementato l'indexer allowedRolesAndUsers, responsabile dell'applicazione dei profili di accesso nelle ricerche fatte al portal_catalog, nel modo in cui è realizzato in Plone 4.
In modo non parametrico, l'indexer va a calcolare solo i ruoli che dispongono del permesso "View", e questo fa saltare il banco, e impedisce il gioco di permessi che abbiamo descritto sopra.
come risolvere?
in un modulo indexer.py scrivi:
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
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())
fatto questo, non servirà altro che l'override dell'indexer originale, fatto creando un file overrides.zcml nella radice del nostro pacchetto da installare contenente:
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:zcml="http://namespaces.zope.org/zcml">
<adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" />
</configure>
alla prossima! :)

Seguici!
linked in
twitter
facebook