0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Railsチュートリアルメモ - 第9章

Posted at

メモの目次記事はこちら

公式Railsチュートリアル第9章へのリンク

9.1 Remember me 機能

ブラウザを閉じてから再度開いてもログイン状態が継続できるようにする。
8章ではsessionメソッドを使って一時的なセッション(ブラウザを閉じるまで)を実現したが、9章ではcookiesメソッドを使ってセッションの永続化を行う。
cookiesを永続化するとセッションハイジャックという攻撃を受ける可能性があるので注意が必要だが、Railsだと対策ができているので大丈夫らしい(知らんけど)。

ここらへんから説明がややこしくなって脱落しそうになってくる。
やっていることはパスワードの実装と似ていて、

  1. ランダムなトークンを生成する
  2. 生成したトークンをハッシュ化し、DBに保存する。このトークンでクッキーのuser_idで指定されたユーザーが正規のユーザーであることを確認する
    • cookies.permanent.signed[:user_id] = user.id)
  3. cookiesに生成したトークンとuser_idを保存する
  4. cookiesからトークンを取り出し、DBに保存されたハッシュ化したトークンと比較する

の4つ。
いったん文章は理解できなくてもコードを書ききった後に、cookieとセッションに関する説明記事と照らし合わせながらコードを理解すると良さそう。

ポイント

  • attr_accesor
    • ゲッターとセッターの同時指定で、インスタンス変数にアクセス可能になる。
  • selfキーワード
    • おそらくinitializeでインスタンス変数を設定しないクラスの場合はメソッド内でself.変数で指定しないとインスタンス変数ではなくローカル変数として新たに変数が作成されてしまうということのよう。
  • 署名付きcookie
    • cookieをブラウザに保存する前に安全に暗号化する
  • cookiesからのユーザー取り出し
User.find_by(id: cookies.signed[:user_id])

9.2 [Remember me] チェックボックス

割愛

9.3 [Remember me] のテスト

  • テスト内ではcookiesメソッドにシンボルを使えないらしい
  • テストの分岐にraiseを仕込むとそのテストが正常にテストされているかどうかわかる(一度も通過していないことになるので)
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?