Import użytkowników z zewnętrznej tabeli do pluginu sfDoctrineGuardPlugin dla Symofny, nie jest taki prosty na jaki wygląda na pierwszy rzut oka. Wydawałoby się, że wystarczy w pętli tworzyć obiekt klassy sfGuardUSer, ustawiać username i password dla niego oraz wywoływać metodę save(). Nic bardziej mylnego. SfDoctrineGuardPlugin do przechowywania haseł używa hasha tworzonego na podstawie soli (salt), dzięki temu zwiększa się bezpieczeństwo. Dodatkowo domyślnie używanym algorytmem jest sha1, a nie popularny md5, stosowany z zapałem przez wielu programistów PHP. Cały problem polega na tym, że plugin przy tworzeniu nowego obiektu, generuje sól (chyba, że podamy własną) i nie przyjmuje do informacji, że ustaliliśmy jej wartość NULL. Małym pocieszeniem jest fakt, że możemy własnoręcznie ustawić dla rekordu algorithm na md5, ale mimo wszystko po ustawieniu hasha do atrybutu password, zostanie on połączony z solą i ponownie zahashowany, co rozwali wszystkie nasze hasła.

Aby temu zapobiec, należy stworzyć klasę ImportsfGuardUser i umieścić ją w lib/ (nie zapomnij wyczyścić cache symfony):

<?php
class ImportsfGuardUser extends sfGuardUser {
  public function setPassword($v) {
    parent::_set('password', $v);
  }
}

i korzystać z tej klasy przy imporcie użytkowników, przykładowo tak:

foreach ( $oldUsers as $row ) {
  $user = new ImportsfGuardUser();
  $user->algorithm = 'md5';
  $user->salt = NULL;
  $user->username = $row['login'];
  $user->password = $row['password'];
  $user->save();
}

Dzięki temu zabiegowi, możesz korzystać z swojej starej bazy użytkowników w nowej aplikacji pisanej w Symfony 🙂