用户验证:为无效的电子邮件/密码输入提供单独的错误

时间:2011-08-18 01:53:40

标签: ruby-on-rails ruby ruby-on-rails-3 authentication alert

在我的Rails应用中,我正在尝试分别为无效flash.now[:alert]:email生成单独的:password。因此,如果用户输入正确的电子邮件但密码错误,:alert会向用户发出无效密码警告,反之亦然。这是我在SessionsController中的内容:

def create
  if user = User.authenticate(params[:email], params[:password])
    session[:user_id] = user.id
    redirect_to user.profile, :notice => "Logged in successfully"
  elsif user.email != params[:email]
    session[:email] = @user.email
    flash.now[:alert] = "Invalid email. Try again!"
    render :action => 'new'
  else
    session[:password] = @user.password
    flash.now[:alert] = "Invalid password. Try again!"
    render :action => 'new'
  end
end

渲染这个给我一个未定义的电子邮件方法。谁能帮我弄清楚我做错了什么?

1 个答案:

答案 0 :(得分:2)

免责声明:显然这是一个非常糟糕的主意,因为攻击者可以继续尝试发送电子邮件,直到找到匹配的电子邮件,然后他就可以开始尝试使用他知道存在于您数据库中的电子邮件的密码了,但你问,所以由你决定是否这样做。

您的身份验证方法显然只会在电子邮件和密码匹配时返回用户,更改您的身份验证方法以返回布尔值和用户(如果有)。看起来有点像这样:

def authenticate(email, password)
  u = first(:conditions => {:email => email, :state => 'active'})
  u && u.authenticated?(password) ? [true, u] : [false, u]
end

然后,在你的控制器上:

def create
  result , user = User.authenticate(params[:email], params[:password])
  if result 
    session[:user_id] = user.id
    redirect_to user.profile, :notice => "Logged in successfully"
  elsif user
    session[:email] = @user.email
    flash.now[:alert] = "Invalid email. Try again!"
    render :action => 'new'
  else
    session[:password] = @user.password
    flash.now[:alert] = "Invalid password. Try again!"
    render :action => 'new'
  end
end

这应该有用。