Проверка силы пустых паролей в Authlogic

Я добавляю опцию сброса пароля к своему приложению направляющих, которое использует Authlogic. Я следовал руководству здесь: http://www.binarylogic.com/2008/11/16/tutorial-reset-passwords-with-authlogic/ и все работают, как я хотел бы за исключением одной вещи: форма сброса пароля принимает пустые пароли и просто не изменяет их.

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

1) Кто-то задал этот тот же вопрос на Google Groups:

Модель User сохраняет с пустым паролем

Ответ Ben должен был использовать @user.validate_password = true вызвать проверку пароля. Я попробовал это, но я получаю ошибку неопределенного метода: undefined method 'validate_password_field=' for #.

2) Кажется, существует названный параметр конфигурации Authlogic ignore_blank_passwords. Это документируется здесь:

Модуль: Authlogic:: ActsAsAuthentic:: пароль:: Config#ignore_blank_passwords

Это похоже на него, работал бы, но мое понимание - то, что это - глобальный параметр конфигурации, который Вы используете в своей начальной букве acts_as_authentic звоните в модель User, и я не хочу изменять ее всего приложения, поскольку у меня действительно есть регулярная форма редактирования для пользователей, где я хочу, чтобы пустые пароли были проигнорированы по умолчанию.

Кто-либо нашел решение этого?Ясно validate_password= в журнале изменений для Authlogic 1.4.1 и ничего об этом удаленный с тех пор. Я просто использую его неправильно? Есть ли способ использовать ignore_blank_passwords на основе на запрос?

5
задан Jimmy Cuadra 1 February 2010 в 00:51
поделиться

4 ответа

Может быть, чтобы проверить значение параметра в контроллере? (Воздушный код):

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  if @user.password.blank?
    flash[:error] = "Password cannot be blank"
    render :action => :edit
    return
  end
  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end
1
ответ дан 18 December 2019 в 09:49
поделиться

Помимо решения zetetic вы можете сделать это следующим образом:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]

  if @user.changed? && @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Вы в основном проверяете, изменил ли authlogic запись пользователя (чего не происходит, если пароль пустой). В блоке else вы можете проверить, был ли пароль пустым, и добавить соответствующее сообщение об ошибке в запись пользователя или отобразить флэш-сообщение.

1
ответ дан 18 December 2019 в 09:49
поделиться

Это своего рода старая ветка, но, поскольку на нее нет ответа, я опубликую это.

Мне удалось сделать это немного чище, чем другие решения, «помогая» аутентификационным проверкам с моими собственными.

Я добавил это пользователю:

class User < ActiveRecord::Base

  ...

  attr_writer :password_required

  validates_presence_of :password, :if => :password_required?

  def password_required?
    @password_required
  end

  ...
end

Вы можете сократить его до двух строк, создав attr_accessor и используя : if =>: password_required (без допроса), но я предпочитайте этот другой синтаксис со знаком запроса.

Тогда действие вашего контроллера может быть выполнено следующим образом:

def update
  @user.password = params[:user][:password]
  @user.password_confirmation = params[:user][: password_confirmation]
  @user.password_required = true

  if @user.save
    flash[:notice] = "Password successfully updated"
    redirect_to account_url
  else
    render :action => :edit
  end
end

Это будет иметь локальный эффект; остальная часть приложения не будет затронута (если password_required не установлено в true в других местах, то есть).

Надеюсь, это поможет.

8
ответ дан 18 December 2019 в 09:49
поделиться
User.ignore_blank_passwords = false

Используйте модель, а не объект для установки этого свойства.

def update_passwords
  User.ignore_blank_passwords = false
  if @user.update_attributes(params[:user])
    ...
  end
  User.ignore_blank_passwords = true
end
2
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: