2013-04-07 61 views
32

我正在使用設計並創建一個名爲active的用戶字段,該字段爲true或false。我必須在允許用戶登錄前手動使用戶激活(true)。至少這是意圖。我曾經嘗試這樣做...檢查用戶在允許用戶使用設計(導軌)登錄之前是否處於活動狀態

class SessionsController < Devise::SessionsController 
    # POST /resource/sign_in 
    def create 
    "resource/signin CREATE" 
    self.resource = warden.authenticate!(auth_options) 
    unless resource.active? 
     sign_out 
     redirect_to :sorry_not_active_url 
     return 
    end 
    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 
end 

然而,這不趕在那裏用戶可以登錄,例如所有的地方,當用戶更改他們的密碼,網站會自動後自動登錄他們進來。但是,如果用戶不活躍,我不希望他們被允許登錄,而是被重定向到sorry_not_active_url。

如果用戶不活躍,防止用戶登錄的最佳方法是什麼?

謝謝。

回答

73

這兩種方法添加到您的用戶模型,設計應自動接他們 - 你不應該需要延長Devise::SessionsController

def active_for_authentication? 
    super && self.your_method_for_checking_active # i.e. super && self.is_active 
end 

def inactive_message 
    "Sorry, this account has been deactivated." 
end 
+0

這太好了!有沒有一種方法來檢查不同的狀態,例如,激活,未激活,未決,通過創建具有4個不同值的字段併爲每個狀態提供不同的消息而被拒絕? – user2012677 2013-04-07 19:55:11

+1

想到它後,我假設我可以使def inactive_message引用一個字段,並且該字段可以爲每個用戶定製一條消息。這看起來是否正確? – user2012677 2013-04-07 22:40:25

+0

聽起來像它會工作 – house9 2013-04-08 02:48:09

3

設計(如果你有設計3.2+)現在支持block參數(會話)創建

# assuming this is your session controller 

class SessionsController < Devise::SessionsController 

def create 
    super do |resource| 
    unless resource.active? 
     sign_out 
     # you can set flash message as well. 
     redirect_to :sorry_not_active_url 
     return 
    end 
    end 
end 
+0

嗨Viren,你能列出幾個好處這樣做,而不是在接受的答案中的實現嗎?我現在想自己實現這一點,並且想知道當前的最佳做法是什麼。謝謝。 – Marklar 2017-01-16 01:37:08

+1

@Marklar當您支持多種身份驗證策略並需要禁用常規身份驗證流程時,這可能很有用,但不是所有情況。雖然OP的用例用於檢查用戶是否處於活動狀態,但如果用戶通過其他方法(例如OAuth)進行了身份驗證,則需要禁用常規會話創建。使用'active_for_authentication?'的基於模型的方法會更加困難。 – sp89 2017-03-15 00:14:33