Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

has_secure_passwordを使って暗号化されたパスワード認証

has_secure_passwordを使った暗号化されたパスワード認証を設定します。
 
(1)概要
 
・bcriptを使ってパスワードをセキュアなハッシュとして保存できます。
 
・ユーザー作成時のパスワード存在チェック、パスワードの確認入力チェックのバリデーションが自動で追加されます。
 
・bcrypt-rubyをインストールをインストールする必要があります。
 
・テーブルに"password_digest"カラムを追加する必要があります。
 
(2)設定手順
 
Userモデルに設定する例を示します。
 
1)bcrypt-rubyをインストール
 
$ vi Gemfile
 
gem 'bcrypt-ruby'
 
$ bundle install
   :
 
2)usersテーブルに"password_digest"カラムを追加
 
①rails generate migrationコマンドでカラム追加
 
$ rails generate migration add_password_digest_to_users password_digest:string
invoke active_record
create db/migrate/20130910074728_add_password_digest_to_users.rb
 
②設定内容確認
 
$ more db/migrate/20130910074728_add_password_digest_to_users.rb

class AddPasswordDigestToUsers < ActiveRecord::Migration
  def change
    add_column :users, :password_digest, :string
  end
end

 
③マイグレーション実行
 
$ bundle exec rake db:migrate
 
3)Userモデルに認証の設定
 
①"has_secure_password"メソッド追加
 
"has_secure_password"によって"password"と"password_confirmation"属性が自動で追加され、存在チェックのバリデーションも設定されます。
 
②パスワードの最小文字数を設定
 
ここでは、パスワードの最小文字数も設定してみます。
 
$ vi app/models/user.rb

class User < ActiveRecord::Base
  has_secure_password
  validates :password, length: { minimum: 6 }
end

 
(3)コンソールで動作確認
 
1)6文字未満のパスワード、"password_confirmation"をブランクでユーザー登録
 
> test = User.create(name: "テスト", email: "test@example.com", password: "test", password_confirmation: "")
 
> test.errors.full_messages
=> ["Password confirmation doesn't match Password", "Password confirmation can't be blank", "Password is too short (minimum is 6 characters)"]
 
2)6文字以上のパスワードでユーザー登録
 
> test = User.create(name: "テスト", email: "test@example.com", password: "test123", password_confirmation: "test123")
=> #<User id: 5, name: "テスト", email: "test@example.com", created_at: "2013-09-10 08:21:37", updated_at: "2013-09-10 08:21:37", password_digest: "$2a$10$aWQHzY.z//y/WJRUK7iAOuNVwytQ/7686bliL.ABRr38...">
 
3)登録後のユーザーの認証確認
 
①登録されたパスワードを表示
 
> user = User.find_by(email: "test@example.com")
 
> user.password_digest
=> "$2a$10$aWQHzY.z//y/WJRUK7iAOuNVwytQ/7686bliL.ABRr38nV3An79Ia"
 
②誤ったパスワードで認証
 
> user.authenticate("invalid")
=> false
 
③正しいパスワードで認証
 
> user.authenticate("test123")
=> #<User id: 5, name: "テスト", email: "test@example.com", created_at: "2013-09-10 08:21:37", updated_at: "2013-09-10 08:21:37", password_digest: "$2a$10$aWQHzY.z//y/WJRUK7iAOuNVwytQ/7686bliL.ABRr38...">