2

Rails 3.2 アプリの認証として Devise を使用しています。私のユーザー モデルは User と呼ばれ、論理的な削除を実装しようとしています。私はacts_as_paranoidを使用してこれを実行しようとしています.acts_as_paranoidは自動的に作業を行います. 非アクティブ化されたユーザーがログインして「非アクティブ化」画面を表示し、アカウントを再アクティブ化する機会を与えたいことを除いて、物事は期待どおりに機能します (他のユーザーは「削除された」ユーザーを見ることができなくなります)。

問題は、Devise (Warden?) が削除されたユーザーを見つけられなくなったことです。Acts_as_paranoid では、スコープ "with_deleted" を使用すると、論理的に削除されたレコードにアクセスできます。だから私はそこへの道のりの一部を得ることができます:

def self.find_first_by_auth_conditions(warden_conditions)
  conditions = warden_conditions.dup
  where(conditions).with_deleted.first
end

これをユーザーモデルに入れました。ログイン情報を入力すると、ログインに成功したというフラッシュメッセージが表示され、ユーザーモデルの「updated_at」列に触れて、ただし、認証されたメソッドが false を返し、current_user ヘルパー メソッドが nil を返すという意味では、実際には認証されません。では、これらを機能させるための最善の戦略は何ですか? with_deleted スコープで User モデルをクエリするように current_user メソッドをオーバーライドできますか? find_first_by_auth_conditions メソッドで行ったように条件を追加するなど、warden で何かをする必要がありますか? これを行う方法がわかりません。どんな助けでも大歓迎です!

また、機能させた後、すべてのソフト削除されたユーザーを「非アクティブ化」ページに自動的に送信したいと思います。ここで唯一のオプションは、完全に削除または再アクティブ化することです。「authenticated :user do {} end」を介したルーティングでこれを行う方法はありますか?それとも、application_controller に before_filter を入れて、リクエストごとにユーザーをチェックする必要がありますか?

4

2 に答える 2

0

「無効化されたページ」へのルーティングに関する最後の質問にお答えします。次のように、ラムダを使用してさまざまなタイプのユーザーを分離できます。

authenticated :user, lambda {|u| u.deactivated? } do
  root :to => 'application#deactivated'
end
authenticated :user, lambda {|u| u.active? } do
  root :to => 'application#active'
end
于 2013-04-16T15:39:02.827 に答える
0

Devise グループからのヒントのおかげで、serialize_from_session メソッドをオーバーライドする必要があることがわかりました。これは認証可能モジュール内にあり、次のようになります。

def serialize_from_session(key, salt)
  record = to_adapter.get(key)
  record if record && record.authenticatable_salt == salt
end

初期化子を使用してモジュールをオーバーライドしようとしても成功しませんでした (既存の戦略をオーバーライドしようとしていたのと、ワーデン用に新しい戦略を作成しようとしていました)。しかし、奇妙な名前のエラーが発生し続けました。私はまだそれを理解していません。ただし、ヒントを参考にして、User モデル内のメソッドをオーバーライドしました。他のリソースを使用することは考えていないので、このように編集するだけで構いません。コードは次のとおりです。

def self.serialize_from_session(key, salt)
  record = with_deleted.find(key).first
  record if record && record.authenticatable_salt == salt
end

これはto_adapter.getメソッドを完全にスキップします(興味のある人にとっては、これはorm_adapterにあり、deviseではありません。これをオーバーライドする必要があると思っていたので、見つけるのにしばらく時間がかかりました)。これはおそらくこれを行うための最もクリーンな方法ではありませんが、私にとっては十分に機能します。また、別のリソースがあったとしても、これは User リソースをオーバーライドするだけなので、それ以外の場合はすべて正常に機能すると思います。

問題が発生した場合は、ここに追加します。そうでない場合、うまくいけば、これは何らかの形で誰かを助けるでしょう. 確かに、底にたどり着くのに十分な時間がかかりました!

于 2013-04-18T01:36:34.957 に答える