セキュリティ系の勉強・その他開発メモとか雑談. Twitter, ブログカテゴリ一覧
本ブログはあくまでセキュリティに関する情報共有の一環として作成したものであり,公開されているシステム等に許可なく実行するなど、違法な行為を助長するものではありません.

ruby チュートリアル9章 メモ

//

SecureRandom.urlsafe_base64

Ruby標準ライブラリのメソッド。長さ22文字の文字列を生成してくれる。base64文字列なので64の22乘通りあるため、衝突の可能性も限りなく低い。

アクセサ

インスタンス変数のゲッターとセッターのこと。rubyのクラスのインスタンス変数にはアクセサが無いとアクセスすることができない。attr_accessorを使用することで自分で書くことなく利用できるようになる。

model(class)内でのselfの意味

チュートリアルでは、変数にselfをつける事でそのインスタンス内で共有が可能な変数を生成している。selfがない場合、ローカル変数になるとの記述があったので、おそらく定義したメソッドのスコープ内でのみ使用可能なものになってしまうはず。 ちなみにメソッドはクラスメソッド内でselfを使用するとクラスを指し、インスタンスメソッド内でselfはそのインスタンスになる。クラスメソッドはmodelクラスのレコードの更新や検索をする用に実装する。

class Article < ActiveRecord::Base
  def hoge       #インスタンスメソッド
  end

  def self.hoge  #クラスメソッド
  end

  def pdf       #インスタンスメソッド
    self.hoge        #インスタンスメソッドのhogeが呼ばれる
    hoge             #インスタンスメソッドのhogeが呼ばれる
    self.class.hoge  #こうするとクラスメソッドのhogeを呼べる
  end

  def self.pdf  #クラスメソッド
    self.hoge        #クラスメソッドのhogeが呼ばれる
    hoge             #クラスメソッドのhogeが呼ばれる
  end
end
# https://qiita.com/suzuki_koya/items/1553c405beeb73f83bbc


cookiesメソッド

1つのvalueとオプションのexpires(有効期限)から成っている。下のようにpermanentを使用すると有効期限が20年に設定される(よく20年設定が使われていた為)

cookies.permanent[:remember_token] = remember_token


それに伴いユーザIDの保存方法も変更する必要がある。signedを使用すると署名付きcookieを使うこと宣言し、permanentではcookieと同じ方法で永続化している。

#変更前
cookies[:user_id] = user.id

#変更後
cookies.permanent.signed[:user_id] = user.id

ユーザIDを取得する際はcookies.signed[:user_id]とする。

remember_me機能

remember_me機能をチェックの有無でクッキーがブラウザに保存されるかが決まる。これだけでこの機能が実現できているのは、セッションにはチェックに関わらず、変数にユーザ情報を保持させているから。一周回って仕組みが把握しにくくなってきた。

ログアウト時のcookieの削除

ログアウト処理にてcookieの値が正常に削除されたかをテストするには下のようにする。responseの中身のcookiesを覗かないと値が削除されていないので注意。

expect(response.cookies['user_id'].nil?).to eq false


インスタンス変数のテスト

インスタンス変数へはassignsを利用することでアクセスが可能になる。チュートリアルではこれを用いることで今までテストされていないかったインスタンス変数をテストした。

#@user内のremember_tokenへアクセスしている
expect(response.cookies['remember_token']).to eq assigns(:user).remember_token