Develop with pleasure!

福岡でCloudとかBlockchainとか。

AuthLogicでID、パスワード以外の項目を認証条件に追加する。

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自体は結構カスタマイズ可能な形で作られてて便利なんだけど、日本語情報があまり無いのがネックかな。
まー、ちゃんと英語読もうよってことか。