2012-03-12 8 views
6

Su un 4.x Plone installare, può siaPlone 4: limitando pubblicato contenuti

  1. contenuto pubblicato essere limitato a un certo utente/gruppo o
  2. contenuti privati ​​essere fatto per mostrare nei menu e ricerche per utenti non registrati?

Ho un cliente che vuole essere in grado di avere il contenuto che può essere visualizzato solo da un certo utente/gruppo, ma verranno visualizzati in un menu o di ricerca quando non connesso.

Cosa sarebbe essere l'approccio migliore per raggiungere questa funzionalità?

+0

Il contenuto "privato" è collegato nei menu e nelle ricerche? In tal caso, cosa succede quando gli utenti anonimi visitano questi link? –

+0

Il contenuto "privato" viene visualizzato solo dagli amministratori o dagli utenti o gruppi assegnati. Se un utente anonimo visita un link, reindirizza alla pagina di accesso come previsto.Il mio obiettivo è quello di trovare un modo per avere il contenuto che appare nel menu e cercare, ma reindirizza per accedere quando la pagina o la cartella viene visitata. –

risposta

7

Dovrete personalizzare il flusso di lavoro, come di seguito:

  • andare a Zope Management Interface-> portal_workflow
  • creare un nuovo stato, diciamo "Trailer" (questo è facoltativo, si poteva personalizzare uno stato esistente invece ... forse lo stato privato sarebbe una buona opzione per gestire restrizioni per specifici utenti/gruppi)
  • Rimuovere tutte le autorizzazioni tranne "Accesso alle informazioni del contenuto" dall'utente anonimo in quello stato specifico
  • Push "Aggiornamento sicurezza s pulsante "ettings"

Fatto! Ora tutti i contenuti nello stato "Trailer" saranno ricercabili ma non visibili da utenti anonimi.

Nota: se si sceglie di creare un nuovo stato, come suggerirei, assicurarsi di aggiungere anche tutte le transizioni necessarie.

Edit:

Purtroppo non ero consapevole del fatto che nelle versioni più recenti di Plone, c'è un nuovo indice nella portal_catalog (allowedRolesAndUsers) che impedisce il processo di cui sopra a lavorare come in passato. Il processo sopra è ancora corretto, anche se dovrai sostituire l'indicizzatore predefinito. Primo create a new package with paster utilizzando il modello "plone". Quindi aggiungere nel livello principale del pacchetto (ad es my.package/mio/pacchetto) un file chiamato indexers.py con questo:

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()) 

e quindi allo stesso livello aggiungere un file overrides.zcml con questo:

<configure xmlns="http://namespaces.zope.org/zope"> 

    <adapter factory=".indexers.allowedRolesAndUsers" name="allowedRolesAndUsers" /> 

</configure> 

alla fine l'albero del vostro prodotto dovrebbe essere simile a questo:

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 

Ultima cosa, è necessario includere l'uovo appena creato nel vostro buildout.cfg:

eggs = 
     my.package 

develop = 
     src/my.package 

Riavviare il buildout. È tutto.

+0

Sto eseguendo Plone 4.1.2 e "Access contents information" sembra non avere alcun effetto su una voce visualizzata nel menu o nella ricerca. Solo quando controllo il permesso 'Visualizza' viene visualizzato nel menu o nei risultati di ricerca. Ho provato uno stato personalizzato oltre a modificare lo stato privato e controllare "Accedi alle informazioni del contenuto" per gli utenti anonimi –

+0

Ignorare questo fatto: devi sempre mantenere "Accesso alle informazioni del contenuto" nella stessa configurazione di "Visualizza", come ha detto Giacomo. Pensali come un permesso unico! –

+0

@keul sembra che tu stia dicendo che View deve essere controllato. Se questo è quello che stai dicendo, allora questo crea lo stesso tipo di stato di quello pubblicato, che non raggiunge l'obiettivo dichiarato. È del tutto possibile che ti sto fraintendendo. –

Problemi correlati