我的应用程序在登录时将用户的文档从数据库加载到 redis session 中。然后它会针对 session 对象执行几乎所有请求验证。
问题:在请求/响应周期之外修改正在进行的 session 以更新验证信息。
例如,如果用户订阅了博客帖子类别,他们可以阅读该类别中的帖子并为该类别做出贡献。但是,如果该类别的版主决定删除它,那么我不仅需要从磁盘上数据库中的用户文档中删除该类别,还需要从 Redis 中的用户 session 中删除该类别。
据我所知,我能做到这一点的唯一方法是在数据库中保存对用户文档中 session ID 的引用,然后在 Redis 中查找相应的 session 。
问题是我不确定 session 是否设计为在请求/响应周期之外进行修改,因为当我进行谷歌搜索时,我还没有真正看到任何相关主题的人想要这样做。
最佳答案
我不认为在 mongo 上存储有关 session 的信息是个好主意。如果用户同时从两个设备登录会怎样?我想在这种情况下您将有两个 session 对象(否则,应该有一种机制来猜测给定用户的 session ,这样您就不会遇到当前的问题)。
我的建议是将用户启动的一组 session 存储在 redis 中。当用户登录时,您将新的 session ID 添加到 SET 中,用户 ID 作为 key 的一部分。当用户注销时,您从 SET 中删除相应的条目。
当然,如果用户没有手动注销(如果您有这种行为), session 就会过期。为此,您可以在每次启动新 session 时将 SETEXP 设置为用户集。只要您的 SETEXP 时间比您的 session 到期时间稍长,您就可以确定只要您的 session 存在, session 就会存储在您的 SET 中。
新版本的 redis 将有一个 Observe 命令,可以更容易地删除从您的 set 对象中删除的 session 。您只需要观察 session 对象的创建/删除,您就可以根据它来管理您的 SET 插入/删除。在该命令正式发布之前,您将不得不坚持按时间过期。
关于node.js - 请求之外的 session 、验证和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21278643/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:
当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested
我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送