【发布时间】:2011-09-22 00:15:22
【问题描述】:
我的 webapp 需要加密其会话数据。我设置的是:
config/initializers/encryptor.rb:
require 'openssl'
require 'myapp/encryptor'
MyApp::Encryptor.config[ :random_key ] = OpenSSL::Random.random_bytes( 128 )
Session.delete_all
app/models/session.rb:
require 'attr_encrypted'
class Session < ActiveRecord::Base
attr_accessible :session_id, :data
attr_encryptor :data, :key => proc { MyApp::Encryptor.config[ :random_key ] }, :marshal => true
# Rest of model stuff
end
这一切都很好,并且保证了会话数据的安全。这是问题所在:当我运行自定义 rake 任务时,它会加载初始化程序并清除所有会话。不好!
我可以在我的初始化程序中添加什么以确保它仅在 webapp 初始化时运行?或者,我可以在我的初始化程序中添加什么以使其不为 rake 任务运行?
更新:好的,我目前所做的是将MYAPP_IN_RAKE = true unless defined? MYAPP_IN_RAKE 添加到我的.rake 文件中。然后在我的初始化程序中:
unless defined?( MYAPP_IN_RAKE ) && MYAPP_IN_RAKE
# Web only initialization
end
似乎有效。但我愿意接受其他建议。
【问题讨论】:
-
这似乎会在未来以其他方式咬你。每次重新启动服务器时,您都会丢失所有会话(这似乎是预期的行为),但这包括服务器因使用过多内存、请求运行时间过长等而自动终止。跨度>
-
我理解缺点,但我认为这是值得的。正在重新启动应用程序重置会话:可以接受。内存太大或请求太长?在独角兽下,这些情况应该只发生在工作进程中。因为我设置了
preload_app = true,所以初始化只发生在主服务器中。所以独角兽可以在不重新初始化的情况下重生工人。
标签: ruby-on-rails ruby rake initializer rake-task