2011-01-11 50 views
2

夥計。進行authlogic登錄驗證時遇到問題。我在用戶模型中有神奇的「活動」字段,例如,如果活動是錯誤的,當用正確的密碼登錄時,它會彈出消息,如「您被暫停,請聯繫您的管理部門」(我在I18n文件中定義了此消息);當使用錯誤密碼登錄時,會彈出not_active消息加上password_invalid消息,如「密碼無效」。我認爲這是因爲authlogic對「活動」字段和密碼都進行了驗證,並且密碼驗證似乎首先出現。Authlogic驗證命令

我的問題是,如果'active'爲false,如何繞過密碼驗證。或者,我只能顯示not_active消息嗎?我的代碼,如:

if @user_session.save 
    redirect_to home_path 
else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
+0

我認爲你應該首先檢查密碼,然後進行激活。 – 2011-01-11 13:24:23

+0

@Joy:但是如果active爲false,我想繞過密碼驗證。如果用戶處於非活動狀態,我只想顯示not_active消息,而不管password_invalid消息是否輸入了正確或錯誤的密碼。 – 2011-01-11 13:29:43

回答

1

好了,我不喜歡這樣的用戶體驗,但如果你真的想,做這樣的事情:

before_filter :restrict_inactive_users, :on=>:create 

def restrict_inactive_users 
    @user = User.find_by_login(params[:user_session][:login]) rescue nil 
    return unless @user 
    unless @user.active? 
    flash[:error] = "You are suspended, please contact your administration" 
    render :action=>:new 
    return false 
    end 
end 

def create 
    @user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
    redirect_to home_path 
    else 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
    end 
end 
0

今天,我想了一個解決方案它不會繞過密碼驗證,只是從user_session中刪除密碼錯誤消息。代碼如:

if @user_session.save 
    redirect_to home_path 
else 
    @user_session.errors.delete(:password) unless @user_session.attempted_record.active 
    render :json => {:success => false, :error => @user_session.errors.full_messages.join("\n")} 
end 
0

開始以您選擇的標識符(如電子郵件或用戶名)提取用戶。 如果用戶不活躍,您可以在重定向回登錄頁面之前刪除其他錯誤。

 @user_session.errors.clear 

然後當頁面被重新渲染時錯誤不會顯示。但是您必須提供自定義錯誤消息,例如通過flash.now[:error]或您的json響應。