Rails密码加密

技术分享 Finley Fu 2018-10-26 0评论 752
在做用户登陆功能时,我们一般不会向数据库存储明文密码,这也是为了防止被窃取,Rails3.1之后的has_secure_password让这一过程变得非常简单。

        在这之前本来是向自己写一个加密过程,但是发现写来写去都是伪加密,安全性还是得不到保障,所以就开始使用rails的这一功能。

        其实has_secure_password的使用非常简单只需在user模型中加入一列password_digest

t.string :password_digest

        然后在model中加入一句话 has_secure_password,然后rails会自动为user模型增加两个属性password  password_confirmation,当然这两个属性是不存放在数据库的,所以也就不容易被窃取。

        在修改密码时只需要正常给password赋值,其他工作rails会自动处理。

        当然也可以给密码加上限制条件,限制最小长度为5

validates :password, :length => { :minimum => 5 }
        但是我在使用时,如果想修改user的其他字段,就必须给password赋值,否则就会认为密码不符合要求,所以就没有使用这个限定,自己写一个也是挺简单的啊

        用户登陆时可以用下面代码验证密码是否正确,如果user不为空,则验证通过,很简单吧

user = User.find_by_username("USERNAME").authenticate("PASSWORD")
        password_confirmation这个属性是密码一致性校验,也就是我们经常在登陆页面输入两次密码,这个就是第二次输入的值,并且只有当其不为nil的时候才会触发校验,必须与password相等。

        has_secure_password还会自动加上下面的验证规则:

           1 create的时候密码必须存在

           2 密码长度要小于等于72字符

           3 当password_confirmation不为空的时候进行确认密码

        当然这些规则如果不需要(比如使用第三方登陆)可以进行移除 

has_secure_password :validations => false