Подтвердить что ты не робот

Почему Devise не разрешает неподтвержденным пользователям входить в систему, даже если allow_unconfirmed_access_for установлен?

У нас есть существующая пользовательская база и мы добавляем подтверждение по электронной почте. Подтверждение является необязательным, но позволит дополнительные функции. Пользователи не обязаны подтверждать. Я добавил подтверждающий модуль и выполнил миграцию. Подтверждение работает как объявление.

Но пользователи не могут войти в систему, так как они не подтверждены. Все текущие пользователи имеют нулевые значения подтверждения, которые мы хотим (пользователи могут вернуться и подтвердить свою электронную почту в любое время). Я следил за всеми статьями wiki и устанавливал allow_unconfirmed_access_for в инициализаторе:

config.allow_unconfirmed_access_for = 10.years 

Я также попытался установить его в нашей модели пользователя:

devise :confirmable, allow_unconfirmed_access_for: 10.years

Я также пытался использовать другие значения (1.year, 500.days и т.д.)

My SessionsController, который не сильно отличается от метода Devise (здесь, на github)

class Users::SessionsController < Devise::SessionsController
  respond_to :json

  def new
    redirect_to "/#login"
  end

  def create
    resource = warden.authenticate(auth_options)
    if !resource
      render json: {error: "Invalid email or password" }, status: 401 and return
    end

    sign_in(resource_name, resource)
    render "sign_in", formats: [:json], locals: { object: resource }
  end
end

Указать ответ:

{ "error": "Перед продолжением необходимо подтвердить свою учетную запись".}

Придумайте 2.1.2 с Rails 3.2.9.

4b9b3361

Ответ 1

Мне просто нужно было сделать это в моей модели User, вместо того, чтобы использовать allow_unconfirmed_access_for:

  protected
    def confirmation_required?
      false
    end

Ответ 2

Команда Devise выпустила версию (2.2.4), которая поддерживает nil как допустимое значение для allow_unconfirmed_access_for, что означает отсутствие ограничений. Проблема: https://github.com/plataformatec/devise/issues/2275

Теперь вы можете сделать:

config.allow_unconfirmed_access_for = nil 

Ответ 3

У меня такая же проблема: после включения утилит подтверждения ранее созданные учетные записи не могут войти в систему.

Причина здесь:

def confirmation_period_valid?
  self.class.allow_unconfirmed_access_for.nil? || (confirmation_sent_at && confirmation_sent_at.utc >= self.class.allow_unconfirmed_access_for.ago)
end

У старых учетных записей установлено значение confirm_sent_at равным нулю, поэтому они не могут войти в систему.

Одним из решений является принудительное подтверждение confirm_sent_at:

update users set confirmation_sent_at=created_at where confirmation_sent_at is NULL;

Вы можете сделать это вручную или создать миграцию.