Rails Tutorial 6.3 パスワードの設定追加

投稿者: | 2019年7月31日

Ruby on Rails 6.3 パスワードの設定追加をやりました。

has_secure_password

モデルに「has_secure_password」と書くと、下記の属性が使えるようになる。

  • password
  • password_confirmation

メソッドでは下記で照合ができる。

  • authenticate

上記の2属性は必須項目になっているらしい。

>> u=User.new({name:"hoge", email:"hoge@hoge.com"})
=> #<User id: nil, name: "hoge", email: "hoge@hoge.com", created_at: nil, updated_at: nil, password_digest: nil>
>> u.valid?
=> false

>> u.errors.full_messages
=> ["Password can't be blank"]
>> u=User.new({name:"hoge", email:"hoge@hoge.com", password:"k", password_confirmation:"k"})
=> #<User id: nil, name: "hoge", email: "hoge@hoge.com", created_at: nil, updated_at: nil, password_digest: "$2a$10$LlkoLt26IFEEhotXPlNtSuiaYPK87B9M2SqDmJcZ.dN...">

>> u.valid?
=> true

使うための条件

password_digestという項目がモデルテーブルに必要で、またbcryptをgem installしている必要があるらしい。

authenticateを使って認証

認証が通った時にそのモデルの情報をとることができる。失敗するとfalseだけが変える。認証された時だけ個人ページを開くようなアプリではそのまま使えそうだが、true or falseで見たいよなぁというときは二重否定もありっぽい。

コメント:uは適当にとったuserのオブジェクト
u
=> #<User id: 7, name: “mm”, email: “mm@localhost.com”, created_at: “2019-07-30 15:16:41”, updated_at: “2019-07-30 15:16:41”, password_digest: “$2a$10$gF41sx0pdn6m6GPFkCOiRueSLLdxPGLmQy8GxYmgNgR…”>

>> u.authenticate(“k”)
=> false

>> u.authenticate(“foobar”)
=> #<User id: 7, name: “mm”, email: “mm@localhost.com”, created_at: “2019-07-30 15:16:41”, updated_at: “2019-07-30 15:16:41”, password_digest: “$2a$10$gF41sx0pdn6m6GPFkCOiRueSLLdxPGLmQy8GxYmgNgR…”>

>> !!u.authenticate(“foobar”)
=> true

updateの時にもパスワードが必要にできる。rolllbackになっている。

>> u=User.find(7)
User Load (0.2ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = ? LIMIT ? [[“id”, 7], [“LIMIT”, 1]]
=> #<User id: 7, name: “mm”, email: “mm@localhost.com”, created_at: “2019-07-30 15:16:41”, updated_at: “2019-07-30 15:16:41”, password_digest: “$2a$10$gF41sx0pdn6m6GPFkCOiRueSLLdxPGLmQy8GxYmgNgR…”>
>>
>> u.name=”update”
=> “update”
>> u.save
(0.1ms) begin transaction
(0.0ms) rollback transaction
=> false

下記はパスワードも入れているのでアップデートに成功している。

>> u.update_attributes(name: "updateupdate", password:"foobar", password_confirmation:"foobar")
(0.1ms) begin transaction
SQL (1.5ms) UPDATE "users" SET "name" = ?, "updated_at" = ?, "password_digest" = ? WHERE "users"."id" = ? [["name", "updateupdate"], ["updated_at", "2019-07-30 15:34:28.943984"], ["password_digest", "$2a$10$Az2oe6MgZqeCGqgEk5k2dOONSZfG1t4IPkxhIP2dDZQoE5mT6UD0O"], ["id", 7]]
(7.1ms) commit transaction
=> true

なんか微妙じゃない?

アプリの種類によってはありかなぁとも思いますが、正直、パスワードは知らんけど他人の情報を編集するシステムなんてざらにあるので、この方法だけ知っていればパスワードを使うシステムが作れるとは言いづらいですね。

私の場合は平文をダイジェストに変換してテーブルに保存し、平文とダイジェストの比較メソッドを用意しておき都度認証する必要が生じたときに使うようにしています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です