Дублированный пользователь, созданный с помощью Devise Gem, несмотря на проверку уникальности - PullRequest
0 голосов
/ 24 июня 2019

У меня есть приложение rails 4, которое использует devise gem для аутентификации. У меня есть validates_uniqueness_of: проверка электронной почты в user.rb

Несмотря на эту проверку, я вижу, что в таблице пользователей создаются повторяющиеся записи.

Странная часть - эти дубликаты создаются во время входа в систему. Для пользователя, выполняющего вход.

Я звоню в after_action, чтобы обновить поле входа в систему, например, - Это находится в session_controller.rb -

after_action :update_login_terms_and_privacy_accepted_at, only: [:create]

def create
    if params[:user][:terms_and_condition].present? && params[:user][:terms_and_condition]=="0"
      self.resource = resource_class.new(sign_in_params)
      reset_session
      flash[:error] = "Please accept our terms and conditions"
      redirect_to new_user_session_url
    elsif Rails.env.production? && !verify_recaptcha
      self.resource = resource_class.new(sign_in_params)
      reset_session
      flash[:error] = "Incorrect Captcha. Please try Again"
      redirect_to new_user_session_url
    else
      if current_user.try(:is_allowed_enterprise_dashboard?)
        current_user.update(uuid: SecureRandom.uuid)
        cookies[:uuid] = current_user.uuid
      end 
      super
    end
  end

  private
  def update_login_terms_and_privacy_accepted_at   
  self.resource.update_attribute("login_terms_and_privacy_accepted_at", Time.now) if self.resource.login_terms_and_privacy_accepted_at.nil?
  end

Вот что я вижу в логах -

 Started POST "/users/sign_in" for 104.143.209.101 at 2019-06-24 18:24:50 +0000

I, [2019-06-24T18:24:50.783420 #32598]  INFO -- : Processing by SessionsController#create as HTML

I, [2019-06-24T18:24:50.783508 #32598]  INFO -- :   Parameters: {"utf8"=>"✓", "authenticity_token"=>"F8BrJRihhHuNA2a8qe82MbXg6rq/sGSVtFaB3xqzHTMqTSEkU+kvQZNs1sLSLEhCRvH29bof8HgFsyANBuliJA==", "user"=>{"email"=>"su***@gmail.com", "password"=>"[FILTERED]", "terms_and_condition"=>"1", "remember_me"=>"0"}, "g-recaptcha-response"=>"", "commit"=>"Log in"}

I, [2019-06-24T18:24:50.980455 #32598]  INFO -- : Redirected to https://gici.com/users/sign_in

I, [2019-06-24T18:24:51.064536 #32598]  INFO -- : 

Sent mail to su***@gmail.com (57.3ms)

Письмо, отправленное в последней строке журнала, относится к созданию дубликата записи пользователя.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 27 июня 2019

Это потому, что у вас есть эта строка кода

self.resource = resource_class.new(sign_in_params)

и затем после действия контроллера вы звоните

update_login_terms_and_privacy_accepted_at

который в свою очередь вызывает

self.resource.update_attribute("login_terms_and_privacy_accepted_at", Time.now)

это сохранит этот объект в базе данных.

Обратите внимание, что https://apidock.com/rails/ActiveRecord/Persistence/update_attribute

проверки в update_attribute пропускаются, поэтому объект сохраняется без проверок -> следовательно, дубликаты записей.

Возможно, вы проводите проверки только на уровне модели. Самый безопасный способ - обеспечить уникальность на уровне базы данных. Вы можете проверить, как это сделать, например, по этой ссылке: https://thoughtbot.com/blog/validation-database-constraint-or-both

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...