ぞえの技術めも

Ruby on Rails勉強中

【50日目】【1日20分のRailsチュートリアル】【第6章】ユーザーの作成とパスワード認証

Ruby on Railsチュートリアル(第3版)

今日は「6.3.4 ユーザーの作成と認証」から。

6.3.4 ユーザーの作成と認証

今回はRailsコンソールを使ってユーザーを手動で作成することにしましょう。
6.1.3で説明したcreateを使いますが、後々実際のユーザーを作成する必要が出てくるので、今回はサンドボックス環境は使いません。
したがって、今回作成したユーザーを保存すると、データベースに反映されます。

最終的にはWebページからユーザー登録できるようにするけど、まだ準備できてないのでコンソールから。

$ rails console
>> User.create(name: "Michael Hartl", email: "mhartl@example.com", password: "foobar", password_confirmation: "foobar")

db/development.sqlite3をダウンロードして、DB Browser for SQLiteで開く。

f:id:kt_zoe:20161012123915p:plain

さっき作成したユーザーが登録されています。

コンソールでpassword_digest属性を確認。

>> user = User.find_by(email: "mhartl@example.com")
>> user.password_digest
=> "$2a$10$L4IH2/vKLSWq.KLDBheFXeQ4mTVMjPjcy7s4F4S/Btcc/LhM.aVPu"

パスワードとして渡した"foobar"という文字列がハッシュ化された結果、だそうです。

has_secure_passwordをUserモデルに追加したことで、そのオブジェクト内でauthenticateメソッドが使えるようになっています。
このメソッドは、引数に与えられた文字列 (パスワード) をハッシュ化した値と、データベース内にあるpassword_digestカラムの値を比較します。

ふむふむ。authenticateを使ってパスワードの整合性をチェックする、ていう感じかな。
ハッシュ化はできるけどハッシュ化された値からパスワードの復元はできない、ってことなのかな。
一方通行。

>> user.authenticate("not_the_right_password")
=> false
>> user.authenticate("foobaz")
=> false
>> user.authenticate("foobar")
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com", created_at: "2016-10-12 02:24:53", updated_at: "2016-10-12 02:24:53", password_digest: "$2a$10$L4IH2/vKLSWq.KLDBheFXeQ4mTVMjPjcy7s4F4S/Btc...">

間違ったパスワードを渡すとfalseが返ってくるけど正しいパスワードを渡せばUserオブジェクトが返ってくる。

Userオブジェクトはnilでもfalseでもないので、いい感じに仕事をしてくれています。

>> !!user.authenticate("foobar")
=> true

なるほど~。

勝手にハッシュ化されるし認証もそれ用のメソッド用意されてるし"セキュア"な部分って何も意識しなくても実現できるんだね…便利。

今日の作業時間は【22分】

次は「6.4 最後に」から。
そろそろ第6章が終わり!