読者です 読者をやめる 読者になる 読者になる

ぞえの技術めも

Ruby on Rails勉強中

【77日目】【1日20分のRailsチュートリアル】【第8章】一時セッションでユーザーをログインできるようにする

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

今日は「8.2 ログイン」から。

Ruby on Railsチュートリアル 第4版が公開されましたが、
途中で切り替えるわけにもいかないので第3版で進めます。

8.2 ログイン

この節では、cookiesを使用する一時セッションでユーザーをログインできるようにします。このcookiesは、ブラウザを閉じると自動的に有効期限が切れるものを使用します。

ふむふむ。ブラウザを開いている間は有効な一時セッションをまず実装するのか。

Railsの全コントローラのベースクラス (=Application コントローラ) にこのモジュールをインクルードすれば、このアプリケーションのコントローラでも使えるようになります。

インクルードしました。

app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  include SessionsHelper
end

8.2.1 log_inメソッド

同じログイン手法を様々な場所で使い回せるようにするために、Sessionsヘルパーにlog_inという名前のメソッドを定義することにします (リスト8.12)

app/helpers/sessions_helper.rb

module SessionsHelper

  # 渡されたユーザーでログインする
  def log_in(user)
    session[:user_id] = user.id
  end
end

session[:user_id] = user.idでユーザーのブラウザ内の一時cookiesに暗号化済みのユーザーIDが自動で作成されるそう。

攻撃者がたとえこの情報をcookiesから盗み出すことができたとしても、それを使って本物のユーザーとしてログインすることはできないのです。
(中略)
永続的なcookiesには、セッションハイジャックという攻撃を受ける可能性が常につきまといます。

へー。一時cookiesと永続的なcookiesは仕組み?が違うのか…。

ユーザーログインを行ってセッションのcreateアクションを完了し、ユーザーのプロフィールページにリダイレクトする準備ができました。

app/controllers/sessions_controller.rb

    :
    if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to user
    else
    :

今はログインしても画面表示が何も変わらないので、ユーザーがログイン中かどうかは、ブラウザセッションを直接確認しない限りわかりません。
このままでは困るので、ログインしていることがはっきりわかるようにします。

$ rails server -b $IP -p $PORT

f:id:kt_zoe:20161124123754p:plain

ログインはできて、ログインしたユーザーのユーザーページは表示されたけど、
今自分がどのユーザーでログインしてるかは分からないね。。。

f:id:kt_zoe:20161124123805p:plain

Chromeデベロッパーツールでcookiesの情報見ればなんか保存されてるのは分かりました。

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

次は「8.2.2 現在のユーザー」から。