ruby-on-rails – 更改密码后用户会话无效,但只有多个线程

ruby-on-rails – 更改密码后用户会话无效,但只有多个线程,第1张

概述我遇到了一个奇怪的问题,我的Rails 4 Devise 3.2应用程序中的一个功能允许用户通过 AJAX POST将密码更改为从Devise wiki Allow users to edit their password派生的以下 *** 作.似乎在用户更改密码后在稍后一个或多个请求之后,它们将被强行注销,并在重新登录后继续被强制注销. # POST /update_my_passworddef up 我遇到了一个奇怪的问题,我的Rails 4 Devise 3.2应用程序中的一个功能允许用户通过 AJAX POST将密码更改为从Devise wiki Allow users to edit their password派生的以下 *** 作.似乎在用户更改密码后在稍后一个或多个请求之后,它们将被强行注销,并在重新登录后继续被强制注销.

# POST /update_my_passworddef update_my_password  @user = User.find(current_user.ID)  authorize! :update,@user ## CanCan check here as well  if @user.valID_password?(params[:old_password])    @user.password = params[:new_password]    @user.password_confirmation = params[:new_password_conf]    if @user.save      sign_in @user,:bypass => true      head :no_content      return    end  else    render :Json => { "error_code" => "Incorrect password" },:status => 401         return  end  render :Json => { :errors => @user.errors },:status => 422end

这个动作在开发中实际上工作正常,但是当我运行多线程,多工作Puma实例时,它在生产中失败了.出现的情况是,用户将保持登录状态,直到其中一个请求到达另一个线程,然后他们以401响应状态注销为Unauthorized.如果我使用单个线程和单个工作程序运行Puma,则不会发生此问题.我似乎只允许用户使用多个线程再次登录的唯一方法是重新启动服务器(这不是解决方案).这很奇怪,因为我认为我的会话存储配置会正确处理它.我的config / initializers / session_store.rb文件包含以下内容:

MyApp的:: Application.config.session_store(Actiondispatch ::会议:: CacheStore,
                                :expire_after => 3天)

我的production.rb配置包含:

config.cache_store = :dalli_store,ENV["MEMCACHE_SERVERS"],{   :pool_size => (ENV['MEMCACHE_POol_SIZE'] || 1),:compress => true,:socket_timeout => 0.75,:socket_max_failures => 3,:socket_failure_delay => 0.1,:down_retry_delay => 2.seconds,:keepalive => true,:failover => true}

我通过bundle exec puma -p $PORT -C ./config/puma.rb启动puma.我的puma.rb包含:

threads ENV['PUMA_MIN_THREADS'] || 8,ENV['PUMA_MAX_THREADS'] || 16workers ENV['PUMA_WORKERS'] || 2preload_app!on_worker_boot do  ActiveSupport.on_load(:active_record) do    config = Rails.application.config.database_configuration[Rails.env]    config['reaPing_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds    config['pool']              = ENV['DB_POol'] || 16    ActiveRecord::Base.establish_connection(config)  endend

那么……这里可能出现什么问题?如何在密码更改后更新所有线程/工作人员的会话,而无需重新启动服务器?

解决方法 由于您使用Dalli作为会话存储,因此您可能遇到此问题.

Multithreading Dalli

从页面:

“如果你使用彪马或其它线程应用程序服务器,达利2.7,你可以使用达利客户池与轨道,保证Rails.cache单不会成为线程争的根源.”

总结

以上是内存溢出为你收集整理的ruby-on-rails – 更改密码后用户会话无效,但只有多个线程全部内容,希望文章能够帮你解决ruby-on-rails – 更改密码后用户会话无效,但只有多个线程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1275699.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存