sfDoctrineGuardPlugin позволяет без лишних телодвижений настроить авторизацию пользователей и групп для проекта на Symfony. Есть у него один неприятный «изъян». При использовании doctrine:data-dump и doctrine:data-load напрочь слетают пароли пользователей, по причине того, что при заливке данных из fixtures пароли по новой шифруются. Что бы избежать это неприятности нужно слегка подпатчить один из методов класса PluginsfGuardUser, а именно setPassword
1. Открываем файл plugins/sfDoctrineGuardPlugin/lib/model/doctrine/PluginsfGuardUser.class.php
2. Находим метод setPassword()
3. Изменяем код следующим образом:
public function setPassword($password)
{
if (!$password && 0 == strlen($password))
{
return;
}
$fromdump = false;
if($this->isNew() && $this->getSalt()){
$fromdump=true;
}
if (!$salt = $this->getSalt())
{
$salt = md5(rand(100000, 999999).$this->getUsername());
$this->setSalt($salt);
}
$modified = $this->getModified();
if ((!$algorithm = $this->getAlgorithm()) || (isset($modified['algorithm']) && $modified['algorithm'] == $this->getTable()->getDefaultValueOf('algorithm')))
{
$algorithm = sfConfig::get('app_sf_guard_plugin_algorithm_callable', 'sha1');
}
$algorithmAsStr = is_array($algorithm) ? $algorithm[0].'::'.$algorithm[1] : $algorithm;
if (!is_callable($algorithm))
{
throw new sfException(sprintf('The algorithm callable "%s" is not callable.', $algorithmAsStr));
}
$this->setAlgorithm($algorithmAsStr);
if($fromdump)
{
parent::_set('password',$password);
} else {
parent::_set('password', call_user_func_array($algorithm, array($salt.$password)));
}
}
После этого можно спокойно работать с fixtures, не поправляя с помощью guard:change-password пароли после каждой заливки дампа.




Comment