どうしてAuthlogic::Session::Baseがコントローラーにアクセスできるのか調べた

Railsで最近人気の認証フレームワーク「Authlogic」は、ユーザーセッションをまるでActiveRecord風なモデルのように扱えることによって、セッション周りの処理をコントローラーからモデル側へ移すことができていて、コードがシンプルになります(コントローラーがごちゃごちゃしないという点で)。

AuthlogicではユーザーセッションをAuthlogic::Session::Baseを継承したクラスで管理するようになっており

# user_session.rb
class UserSession < Authlogic::Session::Base
end

# ログインする
session = UserSession.new(:login => "bjohnson", :password => "my password", :remember_me => true)
session.save

# ログインしているユーザーセッションを取得する
current_user_session = UserSession.find

# ログアウトする
session.destroy

と、こんな感じのインターフェイスでログイン周りの処理が書けて、非常にわかりやすい。

しかし隠蔽されているとはいえ、モデルからセッションやCookieにアクセスするといった事を自分で実装したことがなかったので、一体どんな仕組になっとるんか?と考え調べました。

読んだポインタ

http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/abstract_adapter.rb
http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb

3行で説明

  1. ActionControllerのbefore_filterの先頭で
  2. ActionControllerをラップしたアダプタークラス(RailsAdapter)への参照を
  3. Authlogic::Session::Base.controllerに代入している

モジュールをインクルードしている箇所 http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L48

ActionController::Base.send(:include, Authlogic::ControllerAdapters::RailsAdapter::RailsImplementation)

コントローラーの先頭のフィルターに:activate_authlogicという処理を追加している箇所 http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L36

klass.prepend_before_filter :activate_authlogic

Authlogic::Session::Base.controllreにコントローラーのアダプターを代入している箇所 http://github.com/binarylogic/authlogic/blob/master/lib/authlogic/controller_adapters/rails_adapter.rb#L40-42

def activate_authlogic
  Authlogic::Session::Base.controller = RailsAdapter.new(self)
end

とても勉強になったんだけど、Authlogicはソースが綺麗に分割されすぎてて探しにくい。

関連記事

  1. [Rails] PaperClipを使って本番の時だけAmazon S3を使う
  2. [rails]has_manyなフィクスチャを書くのに疲れたらFactory Girlがオススメ!
  3. Railsのソースの中に「らきすた」が出てくる件
  4. スマートな検索ができるRDocを自分のプロジェクトでも使う方法
  5. Rails2.3のApplication Templateを使ってRspecやI18nの設定を自動化
Posted in ruby, ruby on rails at 2月 15th, 2010. Trackback URI: trackback
Tags: ,

No Responses to “どうしてAuthlogic::Session::Baseがコントローラーにアクセスできるのか調べた”

Leave a Reply