Tag: 会话

为什么rails不断发回Set-Cookie标头?

我遇到的问题是弹性负载均衡器和清漆缓存有关cookie和会话在rails和客户端之间混淆了。 部分问题是,rails几乎在每个请求上都添加了一个“Set-Cookie”标头,并且会话ID。 如果客户端已经发送了session_id,并且它匹配rails将要设置的session_id ..为什么rails会不断告诉客户“哦是啊..你的会话ID是……”

设计登录时重置会话

我在application_controller.rb文件中定义了以下内容: def redirect_back_or(default) redirect_to(session[:return_to] || default) session.delete(:return_to) end def store_location session[:return_to] = request.url end def after_sign_in_path_for(resource) r = session[:return_to] || user_root_url session.delete(:return_to) r end 我正在尝试将用户发送回sign_in之前来自他们的地方,或者,如果没有保存位置,则将其发送到他们的根页面。 我在我的一个控制器中调用它: if current_user.nil? store_location redirect_to home_login_url, alert: “You must be logged in to purchase subscriptions” return end 我通过调试器并观察session[:return_to]设置,但在我登录并after_sign_in_path_for(resource) , session[:return_to]为空。 如何在登录中保留return_to变量? 我正在运行Rails 3.2.1和Devise 2.1.2

更改Rails会话cookie域而不记录用户

我正在使用Rails 4.2.2(使用Devise 3.4.1)并且正在将cookie_store域从www.boundless.dev更改为.boundless.dev,以便在所有子域中共享相同的会话(单点登录) 。 Boundless::Application.config.session_store :cookie_store, key: ‘_boundless_session’, domain: ‘.boundless.dev’ 如果我单独做这个改变。 返回该站点的现有登录用户最终将获得2个_boundless_session cookie,一个使用domain _boundless_session ,另一个使用www.boundless.dev。 不知怎的,这使得登出不可能。 是否可以在不将所有用户从站点中注销的情况下进行此更改? 我以为我能够在我的ApplicationController中编写一个方法作为before_filter来删除会话cookie并将其替换为.boundless.dev中的一个新的,但它不起作用,我怀疑它有一些东西给我使用remember_user_token cookie。 def update_session_cookie_domain session_cookie = cookies[‘_boundless_session’] cookies.delete(‘_boundless_session’, domain: ‘www.boundless.dev’) cookies[‘_boundless_session’] = { value: session_cookie, domain: ‘.boundless.dev’ } end

在Rails控制器中存储对象的最佳方式(会话除外)?

我有一个导轨控制器 class Controllername < application def method1 obj = API_CALL session =obj.access_token redirect_to redirect_url #calls the API authorization end point #and redirects to action method2 end def method2 obj.call_after_sometime end end 我在方法1中调用一些API来获取对象并在会话中存储访问令牌和秘密。 method1完成它的动作。 一段时间后我调用method2 ,现在会话(访问令牌,秘密)被正确存储。 但是,现在在method2我需要使用OBJECT obj调用API call_after_sometime 。但是,现在obj不可用,因为我没有将它存储在会话中(我们将收到存储加密对象的SSL错误)。 我想知道在method1存储obj的最佳方法是什么,以便稍后可以在method2使用它 编辑: 当我尝试Rails.cache或Session我收到错误 TypeError – no _dump_data is defined for class OpenSSL::X509::Certificate 谷歌搜索我发现当我在会话中存储加密值时,它会抛出此错误。

Rails – 会话无法通过AJAX登录?

我有一个Rails应用程序,它使用静态html页面(不在app / views /中)向rails服务器发送AJAX请求以进行登录和注销。 我使用会话进行用户身份validation,当用户登录时, session[:userid]被设置,响应’登录’被发送回静态html页面。 但是,当我单击注销按钮登录后,我发现session[:userid]变为nil 。 这是我的代码: 登录: def login # code here if encrypt(params[:password]) == @user.password # authenticated session[:userid] = @user.id render :text => ‘logged in’ else # wrong password render :text => ‘password not correct’ end end 退出 def logout # here session is no longer available session[:userid] = nil render […]

Rails:如何在会话中存储数据?

我正在Rails中创建一个写作考试练习Web应用程序。 问题是,如果用户的答案被提交到互联网,ETS很容易检测到它们。 因此,当用户在真实测试中再次写出他们的答案时,ETS会认为他们正在从互联网上回答答案并给予他们相当低的分数。 我的方法是将用户的eassay存储在会话中 。 所以它根本不会上传到互联网。 但是,如何在会话中存储对象?

为什么Ruby on Rails会在每次点击时创建新的Sessions(有时)?

出于某种原因,我的RoR应用程序中的会话处理程序似乎在许多用户的生产中表现得很奇怪。 我正在使用默认的RoR ActiveRecord会话存储,在开发过程中一切正常。 只要我保持浏览器打开,每次修改会话时都会更新一个现有数据行,就像您希望会话一样。 当我去生产服务器时,我个人观察到同样的行为。 但是,在查看数据库时,我会在此屏幕截图中看到很多行: http://sofzh.miximages.com/ruby-on-rails// (抱歉,我不能直接在这里包含图片,因为我是新用户) 该网站包含在另一个网站上的iframe中,并有一个调度程序,该调度程序将根据某些会话数据(即对所有用户,相同的URL)将用户发送(redirect_to)到同一控制器中的另一个操作(mydomain.com/dispatcher )将包含在iframe中。 映射到此URL的操作将根据会话[:current_action]决定将用户重定向到哪里。 该网站几乎没有任何流量,所以实际上没有办法。 10个不同的用户每秒向网站发出请求。 实际上,我可以在production.log中看到,在重定向时,用户具有不同的session_id,例如,当访问调度程序时,用户可能具有特定的sessionid,并且在请求实际的目标操作时(由于redirect_to in调度员),sessionid将更改为其他内容。 此外,会话数据行的大多数(> = 97.5%,超过16000个数据行)具有0秒的“生存期”(即created_at等于updated_at)。 你知道什么可能导致这个问题吗? redirect_to调用是否有可能搞乱RoR会话处理? 非常感谢您的想法!

在我开始在线阅读之前,Sessions对我有意义

我从阅读Sessions vs Cookies中收集的主要内容是,Cookie存储在客户端,会话存储在服务器端。 如果会话存储在服务器端,那么服务器如何知道哪个客户端是他们的? 显然,必须在客户端进行某些操作。 每当我使用自动滚动用户身份validation时,我的users数据库表中都有一个session_token列。 然后,这个模块倾向于为我提供便利: module SessionsHelper def current_user User.find_by_session_token(session[:session_token]) end def current_user=(user) @current_user = user session[:session_token] = user.session_token end def logout_current_user! current_user.reset_session_token! session[:session_token] = nil end def require_current_user! redirect_to new_session_url if current_user.nil? end def require_no_current_user! redirect_to user_url(current_user) unless current_user.nil? end end 我相信存储在服务器端的会话,它们意味着每个用户都有session_token 。 此外,会话散列必须在客户端。 如果没有,它在哪里? 请注意,我正在存储用户的session_token,如下所示: session[:session_token] = user.session_token 。 最后,如果我认为会话是在客户端,那么它是如何保持安全的? 最后,这是否与在其他框架(如Django,php框架等)上处理会话的方式相同? […]

如果空闲,Rails protect_from_forgery会中断登录表单

在我们的Rails应用程序中,我们使用protect_from_forgery来防止CSRF。 然而,我们发现,如果用户访问登录页面,然后在应用程序会话到期时间(比如说15分钟)的时间内去喝杯茶。 登录只是重定向回登录页面,无论是否成功凭据(根据环境,我们得到错误InvalidAuthenticityToken 。)尝试再次登录工作正常。 仅当用户在页面上的时间超过会话时间时才会失败。 我们认为这很奇怪,因为我们尚未登录…所以会话即将到期? 并且肯定会在登录时创建一个新会话,即使已创建并已过期。 事实certificate(阅读本文后: https : //nvisium.com/blog/2014/09/10/understanding-protectfromforgery/ )Rails中的CSRF保护实际上使用会话来检查authenticity_token是否有效。 因此,基本上会话在会话到期时到期(取决于session_store设置),并且如果不再刷新页面,则无法登录。 我们解决了这个问题: skip_before_action :verify_authenticity_token, only: [:create]在我们的SessionsController skip_before_action :verify_authenticity_token, only: [:create] ,但现在这意味着我们的登录表单不再受到保护。 有什么其他选择来解决这个问题? 或者我们使用的解决方案并不像我们想象的那样不安全? 谷歌搜索显示这行代码使用了很多次,但肯定是一个坏主意? 我们的另一个解决方案是允许Exception发生,但是优雅地处理它: rescue_from ActionController::InvalidAuthenticityToken do @exception = exception.message render ‘errors/500’, :status => 500, :layout => ‘other’ end 虽然仍然讨厌用户坐在登录页面上的时间超过会话超时(在这种情况下为15分钟)会导致错误! 我们提出的另一个解决方案是将session_store设置为永久,然后手动过期登录会话,如下所示: before_action :session_timeout, if: :current_user def session_timeout session[:last_seen_at] ||= Time.now if session[:last_seen_at] […]

Rails检测用户是否第一次访问

我试图让用户填写问卷,如果这是他们第一次访问该网站。 我的控制器设置如下: class MainController < BaseController end class BaseController < ApplicationController before_filter :first_time_visiting? end class ApplicationController < ActionController::Base def first_time_visiting? if session[:first_time].nil? session[:first_time] = 1 redirect_to questionnaire_path unless current_user end end end 当我关闭浏览器并重新打开它时,我总是被重定向到调查问卷。