2

フレームワークベースではない既存のPHP/MySQLWebサイトがあります。シンプルなセキュリティモデルがあり、ユーザー名とハッシュ(MD5)パスワードを含むusersテーブルがあります。

私は現在、このサイトの「バージョン2」に取り組んでいます。今回は、DoctrineでSymfonyを使用しています。新しいバージョンは正常に機能しており、ユーザー管理にsfDoctrineGuardプラグインを使用しています。

既存のユーザーを最小限の手間で新しいアプリに移行し、既存のユーザー名とパスワードを保持したいと思います。ただし、私の主な問題は、使用しているパスワードハッシュを変更したいということです。

現在のサイトでは、無塩のMD5ハッシュのパスワードを使用しています*。既存のアルゴリズムを維持しながら(無塩のMD5に独自の「アルゴリズム」関数を提供することにより)ユーザーをSymfony / sfDoctrineGuardに移行する方法はすでに理解していますが、無塩のmd5は明らかに理想的ではありません。

つまり、私の質問は、カスタムのプレーンMD5パスワードハッシュアルゴリズムを使用してsfDoctrineGuardユーザーに正常に移行できるユーザーがたくさんいる場合、それらのユーザーを標準のソルトされたSHA1sfDoctrineGuardアルゴリズムを使用するように変換する方法はありますか? ?

再ハッシュするためのユーザーのプレーンテキストパスワードを取得するのはこのときだけなので、各ユーザーがログインするときにのみ、ユーザーごとにこれを実行できると思います。私がする必要があるのは、「このユーザーはこのパスワードで正常にログインした」ポイントで何かにフックすることだと思います。これにより、ユーザーのアルゴリズム、ソルト、およびパスワードを新しいSHA1システムに設定し、ユーザーを彼らがそれについてさえ知らないデータベース。

少し掘り下げてみましたが、sfDoctrineGuard(具体的にはsfGuardSecurityUserだと思いますか?)ログインシステムを適切な場所でオーバーライドまたはフックする方法がわかりません。まあ、実際のプラグインファイルをハッキングせずにはいられません。これは悪そうです。

そこにいるSymfony/sfDoctrineGuardの専門家は私を正しい方向に向けることができますか?

*そのように私を見ないでください、それは私の最初のウェブサイトでした!そして、少なくとも私はそれらを平文で保存しませんでした...

4

2 に答える 2

1

問題を解決するためのオプションはたくさんあります。

sfDoctrineGuardPluginのほとんどすべてをオーバーロードまたは変更できます。

sfGuardSecurityUserで何かを変更する必要がある場合は、アプリケーションのUserクラス(実際にはsfGuardSecurityUserを拡張します)で行うことができます。

デフォルトでlib/model / doctrine/sfDoctrineGuardPluginディレクトリに配置されているモデルクラスをオーバーロードすることも可能です。

デフォルトのガードスキーマを拡張することもできます。たとえば、ユーザーがパスワードを変更したかどうかを示すフィールドを追加し、変更しなかった場合はパスワードを更新できます。

最後に、カスタムパスワードのチェックと設定のアルゴリズムを実装できます: http ://www.symfony-project.org/plugins/sfDoctrineGuardPlugin?tab = plugin_readme (「外部メソッドでユーザーパスワードをチェックする」と「変更」までスクロールしますパスワードの保存に使用されるアルゴリズム」)。

于 2011-02-09T17:55:51.443 に答える
0

私を正確に正しい方向に向けてくれたkubaに感謝します。

このようなことをしようとしている他の人を助けるために、これが私がしたことです。

まず、既存のユーザーを(古いデータベースからダンプされたテキストファイルからのフィクスチャロードを使用して)データベースに移行しました。データの読み込み中に無塩のMD5パスワードを変更しないカスタムアルゴリズムを使用しました(UniqueSentence :: unsaltednotransformと呼ばれます)。これにより、sf_guard_userのユーザーは、「password」に古いパスワードハッシュを使用し、「algorithm」に「UniqueSentence::unsaltednotransform」を使用できます。(行をテーブルに直接移行することもできます。私のものをフィクスチャとして使用すると便利です。)

次に、次のように、/ lib / model / doctrine / sfDoctrineGuardPlugin/sfGuardUser.class.phpに独自のカスタムcheckPassword関数を追加しました。

class sfGuardUser extends PluginsfGuardUser
{
  public function checkPassword($password)
  {
    if ($this->getAlgorithm() == 'UniqueSentence::unsaltednotransform') {
      // Our password has been set by a fixture load that left it in its
      // original state from the old system, an unsalted MD5.

      // Has the user got the right password?
      if (md5($password) != $this->getPassword()) {
        return false;
      }
      // Yes. So, now we re-set the password.
      $this->setSalt(''); // An empty salt will be regenerated
      // Use a smarter algorithm
      $algorithm = sfConfig::get('app_sf_guard_plugin_algorithm_callable', 'sha1');
      $this->setAlgorithm($algorithm); 
      $this->setPassword($password);
      // Could just return true here, but dropping through to the usual
      // method means that if we've broken something, we'll know sooner 
      // rather than later.
    }
    // Just pass the call onto the usual method.
    return parent::checkPasswordByGuard($password);
  }
}

ご覧のとおり、これは非常に簡単です。古いパスワードアルゴリズムを使用しているユーザーを検出した場合は、古いアルゴリズムを使用してパスワードを検証し、正しいパスワードの場合は、アルゴリズムをSHA1に変更して、リセットします。パスワード(最初にソルトを空に設定して、それも再生成されるようにします。)次に、基本クラスで標準のcheckPassword()を使用するようになります。

これは正常に機能しているようです。移行したユーザーとしてログインすると、通常のユーザーと同じように機能しますが、後でデータベースを確認すると、アルゴリズム、ソルト、ハッシュ化されたパスワードが期待どおりに更新されています。

于 2011-02-09T20:36:07.397 に答える