当前位置:  开发笔记 > 后端 > 正文

我怎样才能使一个setter方法的ActiveRecord设置之前,对数据进行加密?

如何解决《我怎样才能使一个setter方法的ActiveRecord设置之前,对数据进行加密?》经验,为你挑选了1个好方法。

我想实现一个User名为DB列的Rails 模型password.我想这样做,当我打电话给...

user_instance.password = 'cleartext'

该方法散列明文把它放在像这样的实例之前:

Digest::SHA1.hexdigest(cleartext)

我尝试过使用回调,但问题是每次保存用户时都会哈希,即使pw没有更新.因此,它被散列和重复了无数遍.

我尝试重新定义password=方法......

alias password= old_password=
def password=(cleartext)
  old_password=(Digest::SHA1.hexdigest(cleartext))
end

但得到一个错误说不password=存在.



1> Matt Rogish..:

仅供参考,您可能需要查看restful_authentication插件,因为它会为您执行此操作.为什么要自己动手?

acts_as_authenticated的方式是:

    数据库/模型有一个名为"encrypted_pa​​ssword"的列

    创建一个名为password的虚拟属性

    密码未填充在查找(..)上,因此如果密码为空,请不要加密

    如果密码是非空白的,则表示用户输入了密码,因此请继续加密并填写encrypted_pa​​ssword

代码片段(从我的用户类中随机复制粘贴,所以不要盲目地粘贴它):

require 'digest/sha1'
class User < ActiveRecord::Base

  # stuff

  # callback
  before_save   :encrypt_password
  attr_accessor :password

  # methods
    def encrypt_password
      return if password.blank?
      salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}--#{login}--") if new_record?
      crypted_password = Digest::SHA1.hexdigest("--#{salt}--#{self.password}--")
    end

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有