0

我对 DataMapper 和 Sinatra 非常陌生,尤其是 attr_encrypted。我想要的是加密存储我的密码,然后能够通过用户名和密码搜索用户。我阅读了attr_encrypted 的文档,但我仍然不知道该怎么做:(

您能否给我一些使用这两种技术的项目示例或告诉我如何更改我的代码以使其工作:(

我的用户类:

  class User
    include DataMapper::Resource

    attr_encryptor :password, :key => 'secret key'

    property :id,       Serial
    property :encrypted_password, Text
  end

当我保存用户时,我这样做:

  username = params[:username]
  password = params[:password]
  user = User.new(:username => username, :encrypted_password => password)
  user.save

这是保存原始密码,而不是加密密码。

而且我不知道如何在密码被加密时搜索用户:(

现在是这样的:

  @user = User.all(:username => username, :password => password)

请原谅我的新手问题,但我真的不太明白:(

非常感谢您!

4

2 回答 2

1

你的加密密码是:password,所以你必须这样做

User.new(:username => username, :password => password)

要通过用户名和密码查找用户,您应该这样做

User.first(:username => username, :password => password)

无论如何,您可以避免使用该 gem 来代替做这样bcrypt的事情。

于 2014-02-03T20:47:46.980 回答
1

您需要在指定 Data Mapper 属性attr_encryptor添加该行。这可以防止 DataMapper 简单地用自己的访问器替换访问器:encrypted_password

class User
  include DataMapper::Resource

  property :id,       Serial
  property :encrypted_password, Text

  # this line moved down from above
  attr_encryptor :password, :key => 'secret key'
end

然后创建用户:

user = User.new(:username => username, :password => password)

您确定要根据加密密码搜索用户吗?通常你会根据例如用户名找到用户,然后检查密码是否匹配。

如果您确实想这样做,则必须在代码中重新创建加密密码并使用该密码进行搜索(您需要查看文档以了解加密是如何完成的):

User.all(:username => username, :encrypted_password => encrypt(password))

或者获取所有匹配的用户并在您的代码中过滤它们:

User.all(:username => name).select {|u| u.password == password}
于 2014-02-03T21:34:19.163 回答