Definire nuovi permessi e ruoli
medio
Supponiamo per esempio di dover definire un nuovo permesso, utilizzato per restringere l'accesso a certe funzionalità solo ad utenti che abbiano un determinato ruolo.
Definire il permesso
Per prima cosa dovremo definire il permesso, scrivendo il seguente codice nel file permissions.py nella root del nostro prodotto:
from Products.CMFCore.permissions import setDefaultRoles
MANAGE_WORKGROUP = 'redomino.workgroup: manage Workgroups'
setDefaultRoles(MANAGE_WORKGROUP, ('Manager',))
Poi bisogna includerlo nell'__init__.py:
from redomino.workgroup import permissions
...
dove per redomino.workgroup si intende il nome del nostro package che andremo a sviluppare.
Definire un nuovo ruolo
Per definire la creazione di un nuovo ruolo ed associarlo a dei permessi possiamo utilizzare Generic Setup e scrivere in rolemap.xml, nel profilo del nostro prodotto, il seguente codice:
<rolemap>
<roles>
<role name="Workgroup manager"/>
</roles>
<permissions>
<permission name="redomino.workgroup: manage Workgroups" acquire="True">
<role name="Workgroup manager"/>
<role name="Manager"/>
</permission>
</permissions>
</rolemap>
Il seguente link porta ad una utile guida per l'utilizzo di Generic Setup (in lingua inglese) nei propri prodotti.
Proteggere la nostra vista Zope 3
Ora proteggeremo la nostra vista, su cui saranno presenti logiche ristrette solo a certi utenti privilegiati.
Per prima cosa andremo ad associare il nostro permesso Zope2/CMF ad un ID richiamabile dai nostri file zcml, che scriveremo successivamente. Per fare ciò dobbiamo definire il file permissions.zcml:
<configure xmlns="http://namespaces.zope.org/zope"
i18n_domain="redomino.workgroup">
<permission id="redomino.workgroup.ManageWorkgroups"
title="redomino.workgroup: manage Workgroups" />
</configure>
Dove:
- title rappresenta il pemesso conosciuto da Zope2/CMF che abbiamo definito in permissions.py;
- id è una chiave univoca associata al permesso.
Nel browser/configure.zcml andremo ad includere il nostro file permissions.zcml appena definito:
<configure
xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser"
i18n_domain="redomino.workgroup">
<include file="../permissions.zcml" />
<browser:page
name="enable-workgroup-mode"
for="Products.Archetypes.interfaces._base.IBaseFolder"
class=".form.WorkgroupForm"
permission="redomino.workgroup.ManageWorkgroups"
/>
</configure>
Da notare che proteggiamo la nostra vista andando a definire nell'attributo permission l'ID definito e non direttamente il permesso. Questo modo di procedere ci consente di cambiare i permessi SENZA toccare codice Python, andando a modificare o customizzare invece un semplice file di configurazione zcml (permissions.zcml), favorendo così la mantenibilità e la riusabilità del codice.
