Аутлогический порядок проверки - PullRequest
2 голосов
/ 11 января 2011

ребята. У меня проблема при проверке авторизации. У меня есть волшебное поле «active» в пользовательской модели, скажем, если active - false, при входе в систему с правильным паролем появится сообщение «Вы приостановлены, обратитесь к администрации» (я определил это сообщение в файле 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 ]

1 голос
/ 11 января 2011

ОК, поэтому мне не нравится это как пользовательский опыт, но если вы действительно хотите, сделайте что-то вроде:

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 голосов
/ 13 марта 2015

Начните с выборки пользователя по выбранному вами идентификатору, например по электронной почте или по имени пользователя.Если пользователь не активен, вы можете удалить другие ошибки, прежде чем вернуться на страницу входа.

        @user_session.errors.clear

Тогда ошибки не будут отображаться при перерисовке страницы.Но вы должны предоставить свое сообщение об ошибке, например, через flash.now[:error] или ваш ответ json.

0 голосов
/ 12 января 2011

Сегодня я придумал решение, которое не обходит проверку пароля, а просто удаляет сообщение об ошибке пароля из 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
...