人。我在进行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
答案 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响应。