尽管具有唯一性验证,但使用Devise gem创建的重复用户

时间:2019-06-24 18:52:09

标签: ruby-on-rails authentication devise duplicates

我有一个使用devise gem进行身份验证的Rails 4应用程序。 我在user.rb中有一个validates_uniqueness_of:email检查

尽管进行了此检查,但我仍在users表中看到重复的条目。

奇怪的是,这些重复的条目是在登录时创建的。对于用户登录。

我正在调用after_action来更新字段发布登录信息,如下所示- 这是在sessions_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 :(得分:0)

那是因为您拥有这一行代码

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表添加唯一约束。