2011-06-23 60 views
5

我目前在Rails項目中使用Devise進行用戶註冊/身份驗證。 當用戶想要取消他們的帳戶時,用戶對象被以下面的方式軟刪除。如何使用Devise停止軟刪除用戶的登錄

How to "soft delete" user with Devise

我implmenetation有一個小的差異這種方式。 用戶模型有一個屬性'deleted_flag'。 而且,soft_delete方法執行「update_attribtue(:deleted_flag,true)」

但是,我必須暗示sign_in的行動。 在我的意思是以下。

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 

我覺得這段代碼有奇怪的一點。

如果刪除的用戶試圖唱歌, 系統允許記錄並立即註銷。 而且,系統不能顯示flash [:alert]消息...

我想知道兩點。

  1. 如何實現禁止已刪除的用戶登錄?
  2. 當刪除的用戶嘗試登錄時,如何實現顯示flash [:alert]?

回答

0

我沒有嘗試過這樣的事情,但它似乎如果你想趕上驗證之前,你要麼必須編寫制定的認證策略或before_filterauthenticate_user!之前運行的用戶。例如:

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 

這將產生通過設計一個無效的電子郵件或密碼提示信息(因爲它無法找到用戶進行身份驗證)

至於你的第二個問題,雖然,你需要一些對在您的控制器中添加特定的Flash消息。但是,在我看來,您應該將「軟」刪除的用戶視爲根本不存在於數據庫中。因此,如果他們試圖登錄,他們應該只是得到一個有效的電子郵件或密碼消息。

+2

請參閱http://stackoverflow.com/q/8107966/249760 - 它實際上既可以停止登錄用戶,也可以踢出當前會話。 –

相關問題