运行环境: rails 4.0.0
ruby2.0.0
sqlite3
活动通中的User模型中,原本用户密码是没有加密的,重构时给密码进行了加密处理。用哈希函数 bcrypt 对密码进行了不可逆的加密,得到密码的哈希值存入数据库中。在程序中使用 bcrypt,需要把 bcrypt-ruby 这个 gem 加入 Gemfile
即把gemfile中的对应注释去掉即可,如下:
之后运行:
加密过程只需调用一个方法,这个方法是 has_secure_password,password 和 password_confirmation 属性的存在性验证以及二者要相等都在 has_secure_password 方法中实现了,只要数据库中有 password_digest 列,在模型文件中加入 has_secure_password 方法后就能验证用户身份了
加密后,在数据库中验证用户信息时,要调用authenticate 方法,authenticate 方法的作用是对比加密后的密码和 password_digest 是否一致,如果提交的数据不合法,authenticate 方法会返回 false。
代码如下:
if @user && @user.authenticate(...)可能出现的结果:
使用 &&(逻辑与)检测获取的用户是否合法。因为除了 nil 和 false 之外的所有对象都被视作 true,上面这个语句可能出现的结果如下所示。即当且仅当数据库中存在提交的用户名并提交了对应的密码时,这个语句才会返回 true。
ruby2.0.0
sqlite3
活动通中的User模型中,原本用户密码是没有加密的,重构时给密码进行了加密处理。用哈希函数 bcrypt 对密码进行了不可逆的加密,得到密码的哈希值存入数据库中。在程序中使用 bcrypt,需要把 bcrypt-ruby 这个 gem 加入 Gemfile
即把gemfile中的对应注释去掉即可,如下:
# Use ActiveModel has_secure_password
gem 'bcrypt-ruby', '~> 3.0.0'之后运行:
bundle install加密过程只需调用一个方法,这个方法是 has_secure_password,password 和 password_confirmation 属性的存在性验证以及二者要相等都在 has_secure_password 方法中实现了,只要数据库中有 password_digest 列,在模型文件中加入 has_secure_password 方法后就能验证用户身份了
class User < ActiveRecord::Base
has_secure_password
end加密后,在数据库中验证用户信息时,要调用authenticate 方法,authenticate 方法的作用是对比加密后的密码和 password_digest 是否一致,如果提交的数据不合法,authenticate 方法会返回 false。
代码如下:
def create
@user = User.find_by(name: params[:session][:name])
if @user && @user.authenticate(params[:session][:password])
sign_in(@user)
else
flash.now[:notice]= '用户名或者密码不正确'
render '/sessions/login'
end
endif @user && @user.authenticate(...)可能出现的结果:
用户 密码 a && b
不存在 任意值 nil && [anything] => false
存在 错误的密码 true && false => false
存在 正确的密码 true && true => true
使用 &&(逻辑与)检测获取的用户是否合法。因为除了 nil 和 false 之外的所有对象都被视作 true,上面这个语句可能出现的结果如下所示。即当且仅当数据库中存在提交的用户名并提交了对应的密码时,这个语句才会返回 true。
Rails用户密码加密实践
本文介绍如何在Rails应用中使用bcrypt对用户密码进行加密处理。通过加入bcrypt-ruby gem,并利用has_secure_password方法,实现密码的安全存储及验证。文章详细解释了如何配置Gemfile、运行bundle install以及如何在User模型中实施密码加密。
2500

被折叠的 条评论
为什么被折叠?



