2017-05-26 11 views
1

私はdeviseでsaml認証にdevise_saml_authenticatable宝石を使用していますが、行105 hereの@@ saml_default_resource_locator 変数を上書きしたいと思います。私はちょうど特定のタイプのユーザーを見ているように余分なwhere節を追加したいです。私は過去に宝石のメソッドをオーバーライドしました(しかし、決してクラス変数)は初期にこのような何かを入れてやってないんこの宝石のモジュールのクラス変数をオーバーライドするにはどうすればよいですか?

RedCloth::Formatters::HTML.send(:include, GemExtensions::RedCloth::Formatters::HTML::Notextile) 

しかし、私は、このインスタンスで起動してどこか分かりません。どんな助けもありがとう、ありがとう!

+0

なぜwhere句を追加する必要がありますか? –

答えて

2

Devise.class_variable_set(
    :@@saml_default_resource_locator, 
    Proc.new do |model, saml_response, auth_value| 
    # whatever you want 
    end 
) 

またはモジュールを開き、再び変数を定義します:

module Devise 
    @@saml_default_resource_locator = Proc.new do |model, saml_response, auth_value| 
    # whatever you want 
    end 
end 

instance_evalを使用して初期化子にこのコードを入れて

トリック、私はあなたとする必要はないと思うと笑uldn't DeviseSamlAuthenticatable宝石をこのように修正してください。この宝石は、主に認証時にDevise.saml_resource_locatorアクセサの下で設定可能なブロックを呼び出します。このブロックが設定されていない場合は、デフォルトでブロックDevise.saml_default_resource_locatorが呼び出されます。

だから、私はあなたが単にsaml_resource_locatorを設定する必要がありを推測:

Devise.saml_resource_locator = Proc.new do |model, saml_response, auth_value| 
    model.where(Devise.saml_default_user_key => auth_value).where(...).first 
end 

また、いくつかのexamplesのための仕様を参照してください。

+0

これはうまくいきました、ありがとう! – xxyyxx

0

クラス変数を変更するのは非常に簡単です。使用できる方法はclass_variable_setです。または、モジュールを開いて変数を再度定義するか、instance_evalを使用します。 @のchumakoffの答えが何だろうが

Devise.instance_eval do 
    @@saml_default_resource_locator = Proc.new do |model, saml_response, auth_value| 
    # whatever you want 
    end 
end 
関連する問題