Authlogic验证顺序

时间:2011-01-11 13:16:36

标签: ruby-on-rails authlogic

人。我在进行authlogic登录验证时遇到问题。我在用户模型中有一个神奇的“活动”字段,如果活动是假的,当用正确的密码登录时,它会弹出“你被暂停,请联系你的管理”这样的消息(我在I18n文件中定义了这条消息) );当用错误的密码登录时,会弹出not_active消息加上password_invalid消息,如“密码无效”。我认为这是因为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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

首先按您选择的标识符(如电子邮件或用户名)提取用户。 如果用户未处于活动状态,您可以在重定向回登录页面之前删除其他错误。

        @user_session.errors.clear

然后在重新呈现页面时不会显示错误。但是您必须提供自定义错误消息,例如通过flash.now[:error]或您的json响应。