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! :)

Share this on

Share |

On same topics

Commenti

comments powered by Disqus