Rubyの認証ライブラリの1つであるAuthLogicは、IDと暗号化されたパスワードによる認証を行う。
ただ、場合によっては、認証時にIDとパスワード以外の項目も認証条件に加えたい場合がある。
そんな場合は、Authlogic::Session::Scopesのwith_scopeメソッドを利用する。
File: README — Documentation for binarylogic/authlogic (master)
通常のID、パスワードによる認証は↓のように記述していたけど、
def create @user_session = UserSession.new(params[:user_session]) if @user_session.save # ログイン成功 else # ログイン失敗 end end
↓のように認証条件に加えたい項目をwith_scopeメソッドを利用して、find_optionsの:conditionsで指定する。こうすると認証時に認証用のテーブルにSQLクエリを投げる際にconditionsで指定した条件がwhere句に加えられる。
def create UserSession.with_scope(:find_options => {:conditions => "user_type = '1'"}) do @user_session = UserSession.new(params[:user_session]) end if @user_session.save # ログイン成功 else # ログイン失敗 end end
with_scopeメソッドがインスタンスメソッドではなく、クラスメソッドなので大丈夫?かと思ったけど、with_scopeメソッドの実装が↓のように内部で、Thread.currentを利用しブロックで渡した内容を処理してるので、リクエスト毎にきちんと処理されると。
module Authlogic module Session module Scopes # :nodoc: ... module ClassMethods def scope Thread.current[:authlogic_scope] end ... def with_scope(options = {}, &block) raise ArgumentError.new("You must provide a block") unless block_given? self.scope = options result = yield self.scope = nil result end ...
AuthLogic自体は結構カスタマイズ可能な形で作られてて便利なんだけど、日本語情報があまり無いのがネックかな。
まー、ちゃんと英語読もうよってことか。