Hola,
me imagino que tienes un campo con el salt generado aleatoriamente para el usuario cuando mete el password.
Luego tendrás otro campo con el hash generado usando el pass y el salt.
Sería comprobar en el login que el hash generado con el pass que introduce el usuario más el salt de la base de datos coincide con el hash general que hay en la BD para el usuario.
Puedes usar esto:
http://php.net/manual/es/function.hash-hmac.php
Y en el sitio donde hacer la lógica del login sería en el fichero /components/UserIdentity.php
class UserIdentity extends CUserIdentity
{
private $_id;
/**
* Authenticates a user.
* The example implementation makes sure if the username and password
* are both 'demo'.
* In practical applications, this should be changed to authenticate
* against some persistent user identity storage (e.g. database).
* @return boolean whether authentication succeeds.
*/
public function authenticate()
{
Yii::log("[UserIdentity][authenticate] - Login para el usuario: ".$this->username, 'info');
$criteria = new CDbCriteria;
$criteria->condition = "LOWER(username)='".strtolower($this->username)."'";
$user=Usuarios::model()->with('grupos')->together()->find($criteria);
if($user===null) {
$this->errorCode=self::ERROR_USERNAME_INVALID;
Yii::log("[UserIdentity][authenticate] - Login incorrecto para el usuario: ".$this->username, 'info');
} else if(($this->password)!==$user->password) {
//else if(md5($this->password)!==$user->password)
$this->errorCode=self::ERROR_PASSWORD_INVALID;
Yii::log("[UserIdentity][authenticate] - Login incorrecto para el usuario: ".$user->username, 'info');
} else if(($this->password)===$user->password) {
$this->_id=$user->id_usuario;
$this->username=$user->username;
$this->setState('usuario_id_usuario', $user->id_usuario);
$this->setState('usuario_username', $user->username);
$this->setState('usuario_nombre', $user->nombre);
$this->setState('usuario_email', $user->email);
$this->setState('grupo_nombre', $user->grupos->nombre);
$this->setState('grupo_codigo', $user->grupos->codigo);
Yii::log("[UserIdentity][authenticate] - ID Usuario: ".$user->id_usuario, 'info');
Yii::log("[UserIdentity][authenticate] - Usuario: ".$user->nombre, 'info');
Yii::log("[UserIdentity][authenticate] - Grupo: ".$user->grupos->nombre, 'info');
$this->errorCode=self::ERROR_NONE;
Yii::log("[UserIdentity][authenticate] - Login correcto para el usuario: ".$user->username, 'info');
}
return !$this->errorCode;
}
/**
* @return integer the ID of the user record
*/
public function getId()
{
return $this->_id;
}
}
Estas línea son las que hay que cambiar y poner que compare el hash que tu haces con el salt de la bd y el password que envía el usuario con el hash general que ya tienes en la bd:
} else if(($this->password)!==$user->password) {
} else if(($this->password)===$user->password) {
Si coinciden entonces entraría en la aplicación.
Para el tema de crear nuevos usuarios, sería en tu sección de administración, habrá una vista con el formulario a rellenar por el usuario y tendrás una acción de CreateUser donde generarás el salt y el hash general y meterás todo haciendo un save() del formulario. Tendrás que cambiar el modelo y el formulario para añadir el campo salt y el campo hash general. En el form pondrás en hidden el salt y el hash.
Yo lo implementaré luego para la aplicación con la que estoy porque ahora mismo lo tengo hecho que almacene el pass en plano. Lo había dejado para el final.
Saludos.