Аутентификация пользователя: Предоставление отдельных ошибок для неверного ввода адреса электронной почты / пароля - PullRequest
1 голос
/ 18 августа 2011

В моем приложении на 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 Ответ

2 голосов
/ 18 августа 2011

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Очевидно, что это действительно плохая идея, поскольку злоумышленник может продолжать пробовать электронные письма, пока не найдет тот, который соответствует, и затем он может начать пробовать пароли для этого электронного письма, которое, как он знает, существует в вашей базе данных, но ты спрашиваешь, так что решать тебе или нет.

Ваш метод аутентификации, очевидно, возвращает пользователя только в том случае, если адрес электронной почты и пароль совпадали, измените метод аутентификации, чтобы он возвращал логическое значение и пользователя, если они есть. Это выглядело бы примерно так:

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

И это должно сработать.

...