2011-06-23 14 views
5

私は現在、Railsプロジェクトのユーザ登録/認証にDeviseを使用しています。 ユーザーがアカウントをキャンセルする場合、ユーザーオブジェクトは次のようにソフト削除されます。Devitsでソフト削除ユーザのログインを停止する方法

How to "soft delete" user with Devise

私implmenetationは小さな違い、この方法を持っています。 ユーザーモデルに属性 'deleted_flag'があります。 そして、soft_deleteメソッドは "update_attribtue(:deleted_flag、true)"を実行します。

しかし、私はsign_inアクションを実行する必要があります。 私のimplmenetationでは次のとおりです。

class SessionsController < Devise::SessionsController 
    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")  

    if resource.deleted_flag 
     p "deleted account : " + resource.deleted_flag.to_s 
     sign_out(resource) 
     render :controller => :users, :action => :index 
    else 
     if is_navigational_format? 
     if resource.sign_in_count == 1 
      set_flash_message(:notice, :signed_in_first_time) 
     else 
      set_flash_message(:notice, :signed_in) 
     end 
     end 
     sign_in(resource_name, resource) 
     respond_with resource, :location => redirect_location(resource_name, resource) 
    end 
    end 
end 

このコードには奇妙な点があります。

削除されたユーザーがサインインしようとすると、 システムはログを許可し、直ちにログアウトします。 そして、システムはフラッシュ[:警告]メッセージを表示できません...

私は2つの点を知りたいと思います。

  1. 削除したユーザーのログインを禁止するにはどうすれば実装できますか?
  2. 削除したユーザーがログインしようとすると、フラッシュ[:警告]を表示する方法を実装しますか?

答えて

0

私はそのようなものを試していないが、あなたが認証する前に、ユーザーをキャッチしたい場合は、authenticate_user!前に実行するための工夫認証戦略やbefore_filterを記述する必要がありますいずれかのようです。次のようなものがあります。

before_filter :no_deleted_users 

def no_deleted_users 
    if User.find(params[:email]).deleted? 
    redirect_to root_path, :flash => { :error => "Your user was deleted. You cannot log in." } 
    end 
end 

これ以上のユーザーを獲得することはできますが、私はDeviseの事前認証をしていません。

9

「ソフト削除」されたユーザーを停止するには、ユーザーモデルでfind_for_authenticationクラスメソッドを上書きすることをお勧めします。以下のような:

Class User < ActiveRecord::Base 
    def self.find_for_authentication(conditions) 
    super(conditions.merge(:deleted_flag => false)) 
    end 

(それが認証するユーザーを見つけることができないので)これは工夫により、無効な電子メールやパスワードのフラッシュメッセージを生成します

限り、あなたの2番目の質問のように、しかし、あなたはのためにいくつかの必要があります特定のフラッシュメッセージを追加するためのコントローラのメソッドしかし、私の意見では、「ソフト」のユーザーは、データベースにまったく存在しなかったのと同じように削除されたユーザーを扱うべきです。したがって、ログインしようとすると、有効なメールまたはパスワードメッセージを受け取るだけです。

+2

実際にはユーザーのサインインと現在のセッションの抹消の両方を実際に行っているhttp://stackoverflow.com/q/8107966/249760も参照してください。 –

関連する問題