[Rails4] DBに暗号化されたパスワードを保存する
暗号化されたパスワード用のカラム名をpassword_digestにする
migration例
class AddPasswordDigestToUsers < ActiveRecord::Migration def change add_column :users, :password_digest, :string end end
暗号化用のハッシュ関数として、bcrypt-rubyをGemfileに追加
gem 'bcrypt-ruby', '3.1.2'
Modelクラスに、has_secure_passwordを追加するだけで以下のことを勝手にやってくれる
→formで確認用パスワードを要求
→最初に入力したパスワード(password)と確認用パスワード(password_confirmation)が一致するかチェック
→暗号化したパスワードをDBに保存
※passwordとpassword_confirmationは、Model内に仮想的に作られるカラムで、実際のテーブルには存在しないカラムである
Model例
class User < ActiveRecord::Base . . . has_secure_password end
has_secure_passwordが如何に便利か
(パスワードの存在検証と確認はhas_secure_passwordによって自動的に追加されます。)
次に、password属性とpassword_confirmation属性を追加し、パスワードが存在することを要求し、パスワードとパスワードの確認が一致することを要求し、さらにauthenticateメソッドを使用して、暗号化されたパスワードとpassword_digestを比較してユーザーを認証するという多くの手順が必要です。この実装が唯一手間のかかる箇所ですが、最新のRailsではhas_secure_passwordを使用するだけでこれらの機能をすべて自由に利用できます。
has_secure_password
データベースにpassword_digestカラムを置くという条件さえ守れば、上のメソッドをモデルに追加するだけで新規ユーザーの作成と認証をセキュアにすることができます。