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…”>