.: HosiriS :.

Informatica e non solo

Come tenere traccia delle operazioni degli utenti connessi con CakePHP

Posted by hosiris su ottobre 13, 2011

Potrebbe essere abbastanza rognoso trovarsi dei dati che per qualche oscuro motivo sono diversi da come li si erano caricati! Magari qualche birbantello inavvertitamente ha fatto delle modifiche… certo assegnando i permessi alle varie tabelle si possono limitare questi inconvenienti, ma rimarrebbe il problema sulle tabelle su cui quell’utente ha i privilegi amministrativi.
Come possiamo tener traccia di ogni operazione eseguita dell’utente?

Ci viene in aiuto un behavior di CakePHP: LogableBehavior.

Il suo utilizzo è molto semplice e ci permette sia di memorizzare solo una serie di azioni eseguite dall’utente, sia informazioni dettagliate su cosa e dove è stato fatto.

Cominciamo con il copiare (o scaricare) il codice da qui e salviamolo in app/model/behaviors/logable.php.
Successivamente sarà necessario creare un model che andrà ad utilizzare una tabella specifica creata nel nostro db:


//app/model/log.php
class Log extends AppModel {
    var $name = 'Log';
    var $order = 'created DESC';
}

Adesso creiamo la nostra tabella “logs” nel database:


--
-- Struttura della tabella `logs`
--
CREATE TABLE `logs` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `title` VARCHAR(50) NOT NULL,
    `created` DATETIME NOT NULL,
    `model` VARCHAR(50) NOT NULL,
    `action` VARCHAR(50) NOT NULL,
    `change` TEXT NOT NULL,
    `user_id` INT(11) NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Notiamo la presenza del campo `user_id`, questo verrà popolato con l’id dell’utente che in quel momento ha effettuato l’accesso.
Adessiamo dovremmo aggiungere il seguente codice in ogni model che sarà nostra intenzione controllare:


var $actsAs = array('Logable' => array(
    'userModel' => 'User', 
    'userKey' => 'user_id', 
    'change' => 'full',
    'description_ids' => TRUE
));

Infine, per fare in modo che venga prelevato il giusto user_id, editiamo la funzione “beforeFilter()” nel file app_controller.php:


//app/app_controller.php
function beforeFilter(){
    . . .
    if (sizeof($this->uses) && $this->{$this->modelClass}->Behaviors->attached('Logable')) {
        $this->{$this->modelClass}->setUserData($this->Session->read('Auth'));
    }
}

Salvate e cominciate ad utilizzare la vostra applicazione, ad esempio eseguite una insert o un edit. Al termine guardate all’interno del DB 😀

Qualora volessimo creare una interfaccia per visualizzare il log sarà sufficiente creare un controller (logs_controller.php) con un metodo index in cui inseriamo semplicemente la query di selezione ($this->Log->find(‘all’);); poi creiamo una cartella logs nelle view ed inseriamo un file index.ctp dove metteremo il codice di visualizzazione.
Non riporto il codice perché è una operazione equivalente ad ogni attività fatta sulle altre tabelle, ma se ci fossero dubbi non esitate a chiedere!!!

Buon divertimento!

Una Risposta to “Come tenere traccia delle operazioni degli utenti connessi con CakePHP”

  1. blackout said

    ottimo articolo – utilissimo

Lascia un commento