Rails 将普通旧字符串作为 BLOB 保存到 SQlite?我快要疯了!

2023-12-06

我不知道为什么会发生这种情况,但 Rails 正在将字符串作为 BLOB 保存到 SQLite。在我的应用程序中创建新用户之前,我会先获取他们的纯字符串密码并对其进行 MD5,然后再保存到数据库:

class User < ActiveRecord::Base
  before_create :encrypt_password

  def encrypt_password
    self.password = Digest::MD5.hexdigest(self.password)
  end
end

但是,密码字段每次都会作为一个奇怪的 BLOB 进入 SQLite!我能说的唯一方法是将表导出到 SQL 时,我可以看到该字段的真实性质:

INSERT INTO "users" VALUES (24, '[email protected]', X'3639366432396530393430613439353737343866653366633965666432326133');

我勒个去??因此,现在当我尝试通过查找用户的电子邮件和 MD5 哈希密码来验证用户身份时,每次都会失败。 REAL 字符串显然与 BLOB 不匹配:

User.find_by_email_and_password('joh[email protected]', Digest::MD5.hexdigest('password') => nil

我一生中从未使用过 BLOB,更不用说作为用户表的密码字段了。我的迁移明确定义了:string作为数据类型。做一个User.columns清楚地表明:

#<ActiveRecord::ConnectionAdapters::SQLiteColumn:0x00000105256ce0 @name="password", @sql_type="varchar(255)"

我已经在这个应用程序上工作了一个月的大部分时间,直到昨晚我为用户模型编写一些测试时才发现这个问题。尝试对用户进行身份验证的测试每次都会失败,因此我开始在控制台中手动构建用户,并发现密码永远不会匹配,因此所有用户查找都会失败。

用于创建用户的 Rails 调试信息如下所示:

INSERT INTO "users" ("created_at", "email", "first_name", "last_login_at", "last_name", "login_count", "password", "role_id", "twitter", "updated_at", "uuid") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)  [["created_at", Mon, 04 Jul 2011 18:50:58 UTC +00:00], ["email", "[email protected]"], ["first_name", "Ebba"], ["last_login_at", nil], ["last_name", "Bayer"], ["login_count", nil], ["password", "5f4dcc3b5aa765d61d8327deb882cf99"], ["role_id", 2], ["twitter", nil], ["updated_at", Mon, 04 Jul 2011 18:50:58 UTC +00:00], ["uuid", "7ab57110-889c-012e-e207-482a140835c4"]]

当我转换为常规 SQL 时,它工作得很好,所以一定有其他事情发生在某个地方。到底是怎么回事?!?!

  • sqlite3 3.6.12
  • 导轨 3.1.0.rc4
  • sqlite3-ruby 1.3.3

UPDATE

它变得越来越陌生......如果我在我的代码中硬编码一些随机字符串encrypt_password方法然后它正确地进入数据库:

def encrypt_password
  self.password = 'foo'
end

我什至可以将其硬编码为字符串“password”的实际 MD5 哈希值,并且它可以工作:

def encrypt_password
  self.password = '5f4dcc3b5aa765d61d8327deb882cf99'
end

但如果我告诉它Digest::MD5.hexdigest('password')然后它作为 BLOB 进入。

现在,如果我添加anything到摘要创建的字符串上,然后就可以了!

def encrypt_password
  self.password = Digest::MD5.hexdigest(self.password) + ' '
end

这他妈到底是什么??所以现在我的练习是添加一个换行符然后将其删除:

def encrypt_password
  self.password = (Digest::MD5.hexdigest(self.password) + "\n").chomp
end

我觉得我应该在 Rails 的某个地方开一张票,但这太奇怪了,我不想因为甚至暗示可能会发生这样的事情而永远被社区嘲笑!


事实证明这是一个编码问题。请在此处查看门票:https://github.com/rails/rails/issues/1965

hexdigest返回一个 ASCII 字符串,但是当您返回查询同一字段时,查询将作为 UTF-8 字符串运行。我假设一旦我手动向字符串添加一些内容,它就会在幕后转换为 UTF-8,然后以 UTF-8 格式正确保存到数据库中。这是修复方法:

def encrypt_password
  self.password = Digest::MD5.hexdigest(self.password).encode('UTF-8')
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 将普通旧字符串作为 BLOB 保存到 SQlite?我快要疯了! 的相关文章

随机推荐

  • 使用 JavaScript 检测时区缩写

    我需要一种方法来检测给定日期对象的时区 我不需要偏移量 也不想要完整的时区名称 我需要获取时区缩写 例如 GMT UTC PST MST CST EST 等 这可能吗 我得到的最接近的是解析结果date toString 但即使这样也不会给
  • 如何使用Microsoft Graph API获取Office365邮件的MIME内容?

    如何使用 Microsoft Graph API 获取 Office365 邮件的 MIME 内容以便我可以创建 EML 文件 或者是否有其他方法可以使用 Microsoft graph API 创建 Office365 中找到的邮件的 E
  • 从 HttpListener 解析 POST 参数

    假设我有 HttpListener 它监听一些端口和IP 当我发送 POST 请求时 它会捕获它 如何从 HttpListenerRequest 解析 POST 参数 HttpListenerContext context listener
  • VBScript 创建一个多维数组并添加到它?

    这对我来说太棒了哈哈 我几乎检查了谷歌搜索上的每个页面 但我仍然不明白该怎么做 我想在 VB 脚本中创建一个名为 data2 的多维数组 尝试我见过的示例 但出现 下标超出范围 错误 Dim data2 sub grabdata SQL q
  • 在 C# 中使用不同的用户凭据将文件保存到文件系统

    如何使用与当前登录用户不同的用户将文件保存到文件系统 我目前正在使用 NET Framework 4 0 如果您有其他用户的登录凭据 您可以冒充他们 使用 DLL Import 在 Win32 中调用 LogonUser DllImport
  • 安装 Apple 的网络链接调节器工具

    我已经在运行 Lion 的机器上安装了 xcode 4 3 1 我在任何地方都找不到网络链接调节器工具 我已经检查了实用程序文件夹 还有xcode contents developer 目录 没有这样的运气 我是否需要安装特定组件或者该工具
  • CodeIgniter - 声明全局变量的最佳位置

    我只想用一个 variable在几个地方 不仅是视图和控制器 而且在routes php和其他配置文件 我不想要这样的事情 使用 Config 类加载配置文件 使用 CIget instance等等 我只想声明一个给定的 variable
  • 有没有简单的方法在 Windows 版 xampp 中安装 SSH?

    有没有简单的方法在 Windows 版 xampp 中安装 SSH 我不相信是这样 即使可以 您也无法像在 nix 机器上所期望的那样无缝访问 apache 和 mysql 如果你已经死心了 最好的选择就是安装 openssh 服务器 ht
  • 在 Next.js 中将回调从服务器组件传递到客户端组件

    我陷入了创建自定义按钮组件 将其标记为客户端组件 然后传递其onClick来自服务器端组件的回调 它给了我这个错误 error Error Event handlers cannot be passed to Client Componen
  • lambda 函数可以模板化吗?

    在 C 11 中 有没有办法模板化 lambda 函数 或者它本身就太具体而无法模板化 我知道我可以定义一个经典的模板化类 函子 但问题更像是 该语言是否允许模板化 lambda 函数 2018 年更新 C 20 将附带模板化和概念化的 l
  • 在WPF中使用C#代码删除IE缓存和Cookie

    我在 WPF 应用程序中使用 WebBrowser 控件 并且希望从代码中清除 IE cookie 缓存 我尝试使用以下代码 string Cookies System IO Directory GetFiles Environment G
  • 从java中的类对象构造类实例

    我需要从类对象数组创建类的新实例 如下所示 static Class spells Fireball class Iceball class 所以当我想调用火球时我应该能够做类似的事情 Spell Currentspell new spel
  • 如何获取本地安装的 Python 模块的列表?

    如何获取我的计算机上安装的 Python 模块的列表 help modules 在 Python shell 提示符中
  • ggplot 多线图上缺少图例

    我正在从包含每年最小值 平均值和最大值的数据框中绘制年度温度数据 我一直无法在我的情节上找到传说 理想情况下 图例应具有图例标题并将线条颜色标记为 最小值 平均值 和 最大值 任何帮助 将不胜感激 数据看起来像 示例 数据名为 s 示例数据
  • 从阅读器中删除或忽略字符

    我正在将所有字符读入流中 我正在使用 inputStream read 读取它 这是 java io Reader 输入流 读入缓冲区时如何忽略 等特殊字符 code private final void FillBuff throws j
  • 如何在地图中平滑移动标记而不闪烁

    每次我收到服务器请求以获取设备的新位置并更新地图上标记的位置时 我的标记都会出现问题 当我的车辆设备移动时 标记将跳转到新位置并闪烁 我怎样才能避免这种情况不闪烁 或者我的标记可以顺利移动 先感谢您 var map var marker v
  • 需要通过 Union() 中的匿名类型显式转换

    我有 2 个 var objects 通过这两个函数检索 private IQueryable
  • 为什么这个正则表达式中的后向表达式没有“明显的最大长度”?

    给定一个包含一定数量的方括号和其他字符的字符串 我想找到所有右方括号 前面有一个左方括号和一些字母 例如 如果字符串是 abc 123 abc 我只想找到第二个右括号 以下正则表达式 会找到第二个右括号 也是最后一个 abc 123 abc
  • 在屏幕上的随机位置生成一个圆圈

    我一直在绞尽脑汁 到处搜索 试图找出如何在屏幕上生成一个随机位置来生成一个圆圈 我希望这里有人可以帮助我 因为我完全被难住了 基本上 我试图创建一个形状 当用户触摸时 该形状总是在屏幕上的随机位置生成 override func touch
  • Rails 将普通旧字符串作为 BLOB 保存到 SQlite?我快要疯了!

    我不知道为什么会发生这种情况 但 Rails 正在将字符串作为 BLOB 保存到 SQLite 在我的应用程序中创建新用户之前 我会先获取他们的纯字符串密码并对其进行 MD5 然后再保存到数据库 class User lt ActiveRe