将用户帐户从Symfony2迁移到Silverstripe 3

时间:2012-12-29 05:35:14

标签: symfony migration silverstripe migrating

我需要有关将用户从使用Symfony2构建的网站迁移到Silverstripe 3的帮助。

我从symfony构建的网站上获得了一个用户表,其中包含sha1哈希密码和盐。我想将用户导入到新设置的Silverstripe 3网站。我尝试通过手动插入哈希密码,盐并将密码加密算法更改为sha1,将样本条目插入SS3s成员表,但它不起作用。我还尝试在Security::set_password_encryption_algorithm中使用_config.php覆盖从河豚到sha1的密码加密,但似乎没有更改密码算法。

我真的需要帮助,因为我还有几天时间来完成项目。关于如何进行迁移的任何想法?

2 个答案:

答案 0 :(得分:1)

symfony2密码加密不仅会对密码+哈希加密一次,而且会加密很多次(默认值为5000)。 Symfony还将密码和哈希连接起来:

$password . '{' . $salt . '}'

您需要在silverstripe 3中重现此技术,或在Silverstripe 3应用程序中使用symfony加密。在查看Symfony\Component\Security\Core\Encoder\MessageDigestPasswordEncoder时,您可以查看实现。

另一种方法是重置每个密码,并在新应用程序处于活动状态时向每个用户发送电子邮件,以便用户可以添加其密码。在这种情况下,您不需要迁移密码,从长远来看,这可能会更好。

答案 1 :(得分:0)

您可以在SS中为此创建自己的密码“encryptor”类(不是100%正确命名...)。我看过SF2 implementation,这是一个未经考验的起点。它不会检查盐中的花括号。

    <?php
class PasswordEncryptor_Symfony2 extends PasswordEncryptor {
    protected $algorithm = 'sha512';
    protected $iterations = 5000;
    protected $encodeHashAsBase64 = true;
    public function encrypt($password, $salt = null, $member = null) {
        $salted = $password . '{' . $salt . '}';
        $digest = hash($this->algorithm, $salted, true);
        for ($i = 1; $i < $this->iterations; $i++) {
            $digest = hash($this->algorithm, $digest.$salted, true);
        }

        return $this->encodeHashAsBase64 ? base64_encode($digest) : bin2hex($digest);
    }
}

您需要通过YML配置在mysite / _config / encryptors.yml中注册此类:

PasswordEncryptor:
  encryptors:
    symfony2:
      PasswordEncryptor_Symfony2: 

并在mysite / _config.php中将其设置为默认值(如果需要):

Security::set_password_encryption_algorithm('symfony2');

为了确保从此类检查从SF2迁移的现有哈希,您需要将PasswordEncryption表中的Member列设置为“symfony2”(每个成员都有其使用的加密器别名单独设置以允许这些类型的迁移)。因此,在SS中创建的任何新用户仍然可以使用默认的SS密码哈希(“blowfish”别名)。