流れ
1. Userのモデルとコントローラーを準備する
rails g model user username:string password_digest:string
rails g controller users
rails db:migrate
users_controller.rb
user.rb
に以下のメソッドを追加します:
class User < ApplicationRecord
has_secure_password
end
2. Gemfileにgemパッケージを追加する
gem 'bcrypt'
ターミナルで次のコマンドを入力します:
bundle install
3. Railsのインタラクティブコマンドラインに入る
ターミナルで次のコマンドを入力します:
rails console
ユーザーを作成します:
User.create(username: "suzuki", password: "password123")
ターミナルに以下の出力が表示されます:
TRANSACTION (0.1ms) begin transaction
User Create (0.5ms) INSERT INTO "users" ("username", "password_digest", "created_at", "updated_at") VALUES (?, ?, ?, ?) RETURNING "id" [["username", "suzuki"], ["password_digest", "[FILTERED]"], ["created_at", "2024-06-26 01:18:17.472828"], ["updated_at", "2024-06-26 01:18:17.472828"]]
TRANSACTION (0.1ms) commit transaction
=>
#<User:0x000000010c894a38
id: 1,
username: "suzuki",
password_digest: "[FILTERED]",
created_at: Wed, 26 Jun 2024 01:18:17.472828000 UTC +00:00,
updated_at: Wed, 26 Jun 2024 01:18:17.472828000 UTC +00:00>
これで、パスワードが暗号化されて保存されました。
问题
質問1:なぜデータベースのusersテーブルのパスワードフィールドはpassword_digestですが、ユーザーを作成する際にはpasswordを渡すのでしょうか?
has_secure_password はRailsの内蔵メソッドで、ユーザーパスワードの暗号化と検証を便利に行うための方法を提供します。具体的には、以下のことを行います:
- 属性処理:モデルに has_secure_password を使用すると、自動的に仮想属性 password が追加されます。この属性はデータベースに保存されません。
password 属性に値を設定すると、has_secure_password はbcryptを使用してパスワードを暗号化し、暗号化された結果をデータベースの password_digest フィールドに保存します。 - 検証:has_secure_password は、モデルに authenticate メソッドを追加します。このメソッドは、ユーザーが提供したパスワードが password_digest に保存されているハッシュ値と一致するかどうかを検証します。また、password 属性の存在性と長さの検証も自動的に追加されます。