たくろぐ!

世界一のチラ裏

8.2 ログイン

目次

8.2.1 log_inメソッド
8.2.2 現在のユーザー
8.2.3 レイアウトリンクを変更する
8.2.4 レイアウトの変更をテストする
8.2.5 ユーザー登録時にログイン

8.2.1 log_inメソッド

ここでは正常にログインできることを想定してcontrollerを定義している。
session[:user_id] = user.idはsessionメソッドでブラウザ上のcookiesに暗号化されたユーザIDを保存している。
これはsessionメソッドでのセッション保存方法で、ブラウザを閉じると消えてしまう。
これを「一時セッション」と呼ぶことが多い。
紛らわしいが、逆にcookiesメソッドによるセッションの場合、「永続的セッション」と呼ぶ。
永続的セッションの場合は常にセキュリティリスクがつきまとう。

8.2.2 現在のユーザー

ここでは現在のユーザ情報を取得するメソッドをcurrent_userにてSessionHelperで定義している。
これによって様々な場面でソースコードの簡略化が期待できる。

8.2.3 レイアウトリンクを変更する

8.2.2に続いて、SessionHelperにてlogged_inメソッドを定義している。
ログインしているときには、Profile、Setting、Log outのボタン、
ログインしていないときには、Log inのボタンを表示するようにviewで切り替えするようにしている。

8.2.4 レイアウトの変更をテストする

passwordからpassword_digestを生成するために、digestメソッドを定義する。

cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                              BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)

さらにfixtureを使ったユーザデータへのアクセスも行なっている。
fixtureを利用したテスト

  def setup
    @user = users(:michael)
  end

今までのテスト

  def setup
    @user = User.new(name: michael)
  end

8.2.5 ユーザー登録時にログイン

session#createでPOST /loginでログイン成功したときにそのユーザをlog_inメソッドでログイン状態にする。

8.1 セッション

目次

8.1.1 Sessionsコントローラ
8.1.2 ログインフォーム
8.1.3 ユーザーの検索と認証
8.1.4 フラッシュメッセージを表示する
8.1.5 フラッシュのテスト

導入

ログインの基本的な仕組み

ログイン機構は、大きく分けると2つの仕組みから成り立つ。

  • 認証システム (Authentification System)

    通信の相手が誰(何)であるかを確認すること

  • 認可モデル (Authorization Model)

    とある特定の条件に対して、リソースアクセスの権限を与えること

上記2つが事実として、混同されがちな理由

「とある特定の条件」というのが「相手が特定の誰かであることが認証されている」という条件であることが多い。

わかりやすい例

Oauthの認証と認可

  • OauthとはTwitterのアカウントで外部サービスにログインしてそのサービスを利用するときなどに使われるやつ

TwitterでTogetterにログインする際、認証はTwitterですでにしてあるのでTogetterで再認証する必要はなく、単にTwitterでの権限をTogetterに委譲しているという意味合いがある。

dev.classmethod.jp

セッションとは

PC同士など、ノード間での接続情報の保持を手助けしてくれるもの。
主にはブラウザ(クライアント)とサーバを想定している。

セッションを実現するには以下の3つの方法がある。

  • sessionメソッド(サーバ側の技術) 【永続性低】→8章
  • cookies(ブラウザ側の技術) 【永続性中】→9章
  • Remember me(サーバ側の技術) 【永続性?】→9章

ちなみにsessionはuserリソースと違ってActiveRecordを上位クラスに持っていないので(そういう実装をしている)、userリソースで使えることが使えないみたいなことが書いてある。
詳細は8.1.4でやるからとりあえずそんな感じなのね〜って感じで覚えておけばいい。

8.1.1 Sessionsコントローラ

ここではセッションを実装するための準備をしている。
主にcontrollerとroutesを設定している。
なので説明は省略。

8.1.2 ログインフォーム

ここではviewを設定している。

  <input class="form-control" id="session_email"
         name="session[email]" type="text" />

この辺の意味は7章に記載されてる。
paramsハッシュを思い出してみるといい。

session:
  email: 'user@example.com'
  password: 'foobar'
commit: Log in
action: create
controller: sessions

8.1.3 ユーザーの検索と認証

ここではcreateメソッドを作成している。
前項のforms要素を利用して、ユーザの入力データを取得して認証を行うまでを実装している。

8.1.4 フラッシュメッセージを表示する

flashは画面描画時に実行される(=リクエストが発生したとき)のでrenderメソッドで擬似的に描画するような場合は適用されず、ずっとエラーメッセージなどが残ってしまうことがある。
ちなみに7.29ではrenderじゃなくて、redirect_toを使ってるのでリクエストが走ってる。
そんなときはflash.newを使えばOK。
flash.newは同一リクエストで1回だけメッセージを表示させてくれる。

8.1.5 フラッシュのテスト

ここではログインが失敗する場合のテストを書いている。
次回8.2でログインが成功するテストを書く。