LoginSignup
4
2

More than 3 years have passed since last update.

Rails gem bcryptの導入

Last updated at Posted at 2019-11-13

Userモデルを作る

Database設計

意味 Column Type Options
名前 name string null: false
メールアドレス email string null: false, unique: true
パスワード password_digest string null: false

userモデルを作成する

ターミナル
$ rails g model user name:string email:string password_digest:string
      invoke  active_record
      create    db/migrate/xxxxxxxxxxxx_create_users.rb
      create    app/models/user.rb

migrationファイルの編集

db/migrate/xxxxxxxxx_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.string :email, null: false
      t.string :password_digest, null: false

      t.timestamps
      t.index :email, unique: true
    end
  end
end

編集が完了したらrails db:migrateをすること。

コンソールからUserモデルのオブジェクトを作ってみる

ターミナル
$ rails c
Running via Spring preloader in process 3745
Loading development environment (Rails 5.2.3)
[1] pry(main)> user = User.create(name: "匿名", email: "user@example.com", password_digest: "digest"[1] pry(main)> user = User.create(name: "匿名", email: "user@example.com", password_digest: "digest")
   (0.2ms)  BEGIN
  User Create (25.6ms)  INSERT INTO "users" ("name", "email", "password_digest", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  [["name", "匿名"], ["email", "user@example.com"], ["password_digest", "digest"], ["created_at", "2019-11-13 06:37:41.060780"], ["updated_at", "2019-11-13 06:37:41.060780"]]
   (12.2ms)  COMMIT
=> #<User:0x00007face35fd128
 id: 1,
 name: "匿名",
 email: "user@example.com",
 password_digest: "digest",
 created_at: Wed, 13 Nov 2019 06:37:41 UTC +00:00,
 updated_at: Wed, 13 Nov 2019 06:37:41 UTC +00:00>
[2] pry(main)> user.password_digest
=> "digest"
[3] pry(main)> 

上記のようにきちんと保存できてたらOK。

パスワードを受け付けてdigestを保存する

gemのbcryptを導入

Gemfile
# 〜省略〜
gem 'bcrypt', '~> 3.1.7' # コメントアウトを解除
# 〜省略〜

bundle installをする。
これでbcryptがインストールできたので、Userモデル内でhas_secure_passwordが使える。

User.rbの編集

user.rb
class User < ApplicationRecord
  has_secure_password
end

上記のようにhas_secure_passwordを記述するとデータベースには対応しない属性が2つ追加される。
1つ目はpasswordであり、2つ目はpassword_confirmationである。

再度コンソールでUserオブジェクトを作り、確認してみる

ターミナル
$ rails c
Running via Spring preloader in process 4214
Loading development environment (Rails 5.2.3)
[1] pry(main)> User.new(name: 'ユーザー', email: 'sample@example.com', password: 'password', password_confirmation: 'password').save

無事に登録できたら、password_digest属性にどのような値が入っているか確認してみる。

ターミナル
> user.password_digest
=> "$2a$12$LLD1gCo75.pc3//VwSXECe7lLJJsIuMsT0SKFozfCxVMtW8ogaZ.a"

上記のようになればきちんとハッシュ化されていることになる。
has_secure_passwordは、パスワードのハッシュ化だけではなく、認証のための機能も追加してくれる。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2