Come cambiare il contesto di sicurezza

Questo metodo permette di cambiare il contesto di sicurezza on-the-fly, in modo da scavalcare eventuali blocchi dovuti a mancanza di ruoli/permessi.

Spesso accade di avere bisogno che l'utente corrente del vostro portale debba fare delle operazioni particolari, sulle quali non ha i permessi necessari per poterle eseguire.

Un esempio potrebbe essere quello di dover dare la possibilità ad utenti "anonimi" di creare oggetti in una particolare cartella, oppure dare la possibilità di vedere localmente oggetti non pubblicati.

from AccessControl import getSecurityManager
from AccessControl.SecurityManagement import setSecurityManager
from AccessControl.SecurityManagement import newSecurityManager
from AccessControl.User import UnrestrictedUser as BaseUnrestrictedUser

class UnrestrictedUser(BaseUnrestrictedUser):
    """Unrestricted user that still has an id."""
    def getId(self):
        """Return the ID of the user"""
        return self.getUserName()

def switchToManager(obj):
    """
    assume the security context of a Manager
    """
    acl_users = getToolByName(obj, 'acl_users')
    old_sm = getSecurityManager()
    tmp_user = UnrestrictedUser('temp_usr', '', ['Manager'], '')
    tmp_user = tmp_user.__of__(acl_users)

    newSecurityManager(None, tmp_user)
    return old_sm


# per creare il nuovo contesto di sicurezza con ruolo Manager momentaneo
old_sm = switchToManager(context)

<blocco di operazioni>

# per resettare il contesto finite le operazioni "particolari"
setSecurityManager(old_sm)

Praticamente viene creato un utente temporaneo con ruolo Manager in modo che il blocco di codice

venga eseguito inj un contesto di sicurezza nel quale "tutto è permesso".

 

N.B. : Dopo aver fatto un cambio di contesto di sicurezza, così come indicato, non bisogna mai dimenticare la chiamata a "setSecurityManager".

Se non viene risettato il contesto di sicurezza di partenza, l'utente corrente si ritroverebbe a poter effettuare qualsiasi cosa (buona o cattiva che sia) sul portale nello spazio della sessione corrente.

Share this on

Share |

On same topics

Commenti

comments powered by Disqus