1

Rails アプリで認証を処理するために Devise を使用しており、permanent_records を使用してユーザーを論理的に削除しています。私の User モデルのデフォルトのスコープは、削除されていないユーザーです。ユーザーが自分のアカウントを削除 (非アクティブ化) した場合、Facebook と同様に、ログインすることでアカウントを再アクティブ化できるようにしたいと考えています。問題は、Devise が削除されたユーザーを探す方法を知らないため、アカウントが見つからないことです。sessions#create メソッドをオーバーライドすることを考えました

 def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message(:notice, :signed_in) if is_navigational_format?
    sign_in(resource_name, resource)
    respond_with resource, :location => after_sign_in_path_for(resource)
  end

しかし、これは Warden によって処理されているため、運が悪いようです。深く掘り下げ始めると、物事を壊し始めるのではないかと心配しています。

何か案は?

ありがとう!

4

2 に答える 2

4

必要なもの:

  1. User モデルのメソッドを上書きfind_for_authenticationして、すべてのユーザーが検索できるようにしますhttps://github.com/plataformatec/devise/blob/master/lib/devise/models/authenticatable.rb#L229

  2. モデルのメソッドを再定義after_database_authenticationして、ここで削除されたフラグを削除しますhttps://github.com/plataformatec/devise/blob/master/lib/devise/models/database_authenticatable.rb#L98

それだけだと思います。コントローラーのアクションに触れる必要はありません。

于 2013-04-04T21:09:23.100 に答える
0

これは paranoia gem で動作します:

class << self
  def find_for_authentication(conditions)
    User.unscoped do
      user = super(conditions)
      user.restore!(recursive: true) if user.deleted?
      user
    end
  end
end
于 2016-04-21T04:08:34.523 に答える