【问题标题】:Mapping 'OLD' database to a new database model for use with Symfony FOSUserBundle将“旧”数据库映射到新的数据库模型以与 Symfony FOSUserBundle 一起使用
【发布时间】:2016-02-01 13:48:27
【问题描述】:

我使用 Symfony(使用 FOSUserBundle)和 Doctrine 从头开始​​重新开发了一个非常古老的网站。旧站点仍然在线,并且在数据库中有“实时”数据(具有latin1 字符集),我试图弄清楚如何将其传输到新数据库(utf8mb4 字符集)。

新站点可以很好地处理我加载到开发数据库Doctrine Fixtures 中的虚拟数据。但是,例如,对于 FOSUserBundle,数据库表具有更多的强制性参数,其中包含以下变量:

现任成员:

userid
username
email
password
joindt

FOSUserBundle 表:

id
username
username_canonical
email
email_canonical
salt
password

但是,我整个周末都在尝试各种不同的方法来复制旧数据库并将其转换为新数据库所需的内容,即在关闭外键生成的情况下从 PhpMyadmin 导出,尝试导出方法,例如:

  • 1a。 csv文件的不同配置

  • 1b。在excel中打开以调整列(例如复制username并再次粘贴为username_canonical

  • 1c。将 csv 文件作为新的数据库表导入回 PhpMyAdmin 或删除外键约束并清空新表并读入数据

  • 2a。 SQL代码

  • 2b。运行此 SQL 代码以提供旧 SQL INSERT INTO 步骤
  • 2c。键入手动 SQL,例如 CREATE TABLE Member as SELECT username as username, username as username_canonical FROM old

我已经尝试了所有这些的许多组合,但都没有奏效。我敢肯定,如果我继续坚持下去,我将能够拼凑出一些东西来生成这个 FOSUserBundle Member 表。但是,我担心我会遇到另一个问题,即表格之间的关联不允许我创建其他表格(例如ProductsOrders)。

一目了然:

【问题讨论】:

  • 我可能会使用Doctrine\MigrationsBundle 并编辑通过运行doctrine:migrations:diff 创建的sql 来处理您的更改。您可以在其中编写任意数量的复杂脚本来处理您的问题。

标签: mysql symfony orm doctrine-orm


【解决方案1】:

嗯,你有一个大问题。在 username_canonical 和 email_canonical 的情况下很简单,因为这些字段只是用户名和没有大写字母的电子邮件,也许其他规则适用(您必须调查)但基本上就是这样。真正的问题是密码。我假设在您的旧数据库中,密码是用一些不可逆的算法加密的。 FOSUserBundle 的模型是获取注册密码,加入随机生成的盐,用定义的算法加密整个集合,并将结果持久化。当请求登录时,激活相同的过程(当然没有盐生成)。因此,也许如果旧数据遵循相同的注册和身份验证步骤,您可以将对应密码和盐字段的旧帐户迁移到新结构,并在新的 config.yml 中设置相同的加密算法,但如果新数据库需要使用其他字符集,我没有看到可能的迁移解决方案。

如果可以以明文形式检索旧密码,则可以设法为新帐户生成所有密码和盐,如果不是这样,我看不到迁移方式。也许如果不需要字符集,您可以更改 FOSUserBundle 以避免生成盐(盐生成防止字典攻击)。 有一种可能的解决方案,将旧数据库连接仅用于身份验证目的,并迁移其余数据,但除了管理两个连接之外,您还存在手动确保相关表的引用完整性的问题,但也许如果您有这种可能性是实现目标的唯一途径。

【讨论】:

  • 嘿@abdiel,感谢您指出这一点-我之前一直想知道密码,并在这个问题下检查了我的计划:stackoverflow.com/questions/34925591/…。我认为这应该可以保护我免受密码哈希的问题?如果我遗漏了什么,请告诉我!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2013-04-20
  • 2017-12-24
  • 1970-01-01
  • 2013-11-23
  • 2010-10-21
  • 2012-09-18
相关资源
最近更新 更多