至少6个字符的密码不起作用[rails 4]

时间:2014-01-23 11:58:54

标签: ruby-on-rails ruby-on-rails-4

我正在阅读使用rails 4的敏捷Web开发的书

在用户模型中我有一个不能少于6个字符的密码验证

validates :password_digest, length: {minimum: 6}

但实际上,当我创建一个新用户时,它允许我用少于6个来完成。任何建议?

由于

2 个答案:

答案 0 :(得分:3)

简短 - 你正在验证错误的字段。替换:password_digest:密码。

validates :password, length: { minimum: 6 }

这里有点长的解释: 我打开了一本书并查看了第14章(名为“任务I:登录”)。 看起来您的用户表中包含列'name','password_digest'和'salt'。 本书中的示例描述了如何散列密码,将其与salt混合并将结果存储在数据库中。重点是 - 即使您从一个字母生成此密码,您的'password_digest'也会足够长。您可以自己在irb中尝试:

require 'digest'
Digest::SHA2.hexdigest('a') #=> "ca978112ca1bbdcafac231b39a2..."

因此,您不应该验证散列密码的长度。相反,您应该验证'密码'属性本身。

答案 1 :(得分:2)

<强>加密

您正在验证password_digest - 这表明它是加密密码?

正如评论中所提到的,除非您的表单输入将被称为password_digest,否则在执行验证之前可能会对进行哈希,使此值始终超过6个字符< / p>

对此的即时修复(虽然我不确定它是否完全正确)是验证“裸”密码。这将验证密码为已插入,而不是散列版本:

#app/models/user.rb
Class User < ActiveRecord::Base
     validates :password, length: {minimum: 6}
end