Auditoria en Yii

| 2014-01-17 | No hay comentarios »

Una manera simple y efectiva de hacer un seguimiento de lo que sus usuarios están haciendo dentro de la aplicación consiste en registrar sus actividades relacionadas con las modificaciones de base de datos. Puede iniciar sesión cada vez que se inserta un registro, cambiar o suprimir, y también cuándo y por qué usuario se hizo. Para un modelo CActiveRecord te vendría bien un comportamiento para este propósito. De esta manera usted será capaz de añadir la funcionalidad de registro para ActiveRecords muy fácilmente.

En primer lugar se debe crear una mesa para el diario de las líneas en la base de datos. He aquí un ejemplo (MySQL):


CREATE TABLE ActiveRecordLog ( id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, description VARCHAR(255) NULL, action VARCHAR(20) NULL, model VARCHAR(45) NULL, idModel INTEGER UNSIGNED NULL, field VARCHAR(45) NULL, creationdate TIMESTAMP NOT NULL, userid VARCHAR(45) NULL, PRIMARY KEY(id) ) TYPE=InnoDB;

El siguiente paso es crear el archivo ActiveRecordLogableBehavior.php y guárdelo en (\protected\behaviors):


class ActiveRecordLogableBehavior extends CActiveRecordBehavior
{
    private $_oldattributes = array();

    public function afterSave($event)
    {
        if (!$this->Owner->isNewRecord) {

            // new attributes
            $newattributes = $this->Owner->getAttributes();
            $oldattributes = $this->getOldAttributes();

            // compare old and new
            foreach ($newattributes as $name => $value) {
                if (!empty($oldattributes)) {
                    $old = $oldattributes[$name];
                } else {
                    $old = '';
                }

                if ($value != $old) {
                    //$changes = $name . ' ('.$old.') => ('.$value.'), ';

                    $log=new ActiveRecordLog;
                    $log->description=  'User ' . Yii::app()->user->Name
                                            . ' changed ' . $name . ' for '
                                            . get_class($this->Owner)
                                            . '[' . $this->Owner->getPrimaryKey() .'].';
                    $log->action=       'CHANGE';
                    $log->model=        get_class($this->Owner);
                    $log->idModel=      $this->Owner->getPrimaryKey();
                    $log->field=        $name;
                    $log->creationdate= new CDbExpression('NOW()');
                    $log->userid=       Yii::app()->user->id;
                    $log->save();
                }
            }
        } else {
            $log=new ActiveRecordLog;
            $log->description=  'User ' . Yii::app()->user->Name
                                    . ' created ' . get_class($this->Owner)
                                    . '[' . $this->Owner->getPrimaryKey() .'].';
            $log->action=       'CREATE';
            $log->model=        get_class($this->Owner);
            $log->idModel=      $this->Owner->getPrimaryKey();
            $log->field=        '';
            $log->creationdate= new CDbExpression('NOW()');
            $log->userid=       Yii::app()->user->id;
            $log->save();
        }
    }

    public function afterDelete($event)
    {
        $log=new ActiveRecordLog;
        $log->description=  'User ' . Yii::app()->user->Name . ' deleted '
                                . get_class($this->Owner)
                                . '[' . $this->Owner->getPrimaryKey() .'].';
        $log->action=       'DELETE';
        $log->model=        get_class($this->Owner);
        $log->idModel=      $this->Owner->getPrimaryKey();
        $log->field=        '';
        $log->creationdate= new CDbExpression('NOW()');
        $log->userid=       Yii::app()->user->id;
        $log->save();
    }

    public function afterFind($event)
    {
        // Save old values
        $this->setOldAttributes($this->Owner->getAttributes());
    }

    public function getOldAttributes()
    {
        return $this->_oldattributes;
    }

    public function setOldAttributes($value)
    {
        $this->_oldattributes=$value;
    }
}

El siguiente paso es agregar el siguiente código a los modelos que quieran que tenga control de auditoría:


public function behaviors()
{
    return array(
        // Classname => path to Class
        'ActiveRecordLogableBehavior'=>
            'application.behaviors.ActiveRecordLogableBehavior',
    );
}

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Backup en Yii



SEGUÍNOS EN FACEBOOK


GITHUB