【问题标题】:Using attr_encrypted with DataMapper and Sinatra将 attr_encrypted 与 DataMapper 和 Sinatra 一起使用
【发布时间】:2014-02-04 05:48:47
【问题描述】:

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

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

我的用户类:

  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)

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

提前非常感谢您!

【问题讨论】:

    标签: ruby sinatra ruby-datamapper attr-encrypted


    【解决方案1】:

    您需要在指定数据映射器属性之后添加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}
    

    【讨论】:

    • 谢谢,我换了他们的位置:)
    • 嗯,是的,最好只是看看密码是否匹配。
    • 哦,你,好人,非常感谢!现在一切正常!非常感谢!
    【解决方案2】:

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

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

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

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

    无论如何,您都可以避免使用 bcrypt 做类似 this 之类的事情。

    【讨论】:

    • 非常感谢!但是,当我尝试使用您的建议查找用户时,我得到 condition :password does not map to a property or relationship :( 我尝试使用 :encrypted_pa​​ssword 更改它,但没有找到这样的用户 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    相关资源
    最近更新 更多