rails在会话中存储密码

Gau*_*hah 6 session ruby-on-rails

我有一个使用web api调用的rails应用程序,rails app本身没有任何数据库或用户界面.每个api调用都需要为每个请求发送用户名和密码.

我想为rails app提供一种身份验证机制.我打算这样做:

  1. 显示登录页面
  2. 获取用户名和密码
  3. 存储用户名和密码
  4. 通过warden.authenticate或authlogic.something执行手动身份验证(或者甚至可能是不需要的,只需检查会话是否存储了某些内容)
  5. 然后,当用户执行某些操作时,我会传递先前存储的用户名和密码.

现在我的问题是我在哪里存储密码?如果我使用会话我明显不能使用cookie存储,我可以使用session_store = :active_record_store但不确定它是否安全,我现在还没有任何数据库所以我为什么要创建一个仅用于会话?是否有其他机制可以在会话中存储密码?(明显安全的方式)

早期的铁路有:

  • MemoryStore的
  • FileStore的

但现在两者似乎都被删除了.还有其他解决方案吗?

答案备注:

  1. 存储加密密码不起作用,因为我需要在进行api调用时将原始密码发送到服务器.
  2. 我无法控制API,所以我无法更改其身份验证.
  3. rails app上没有用户配置文件维护.所有由API调用管理的东西.

我终于想到实现自定义内存存储但它似乎抛出stackoverflow错误.我从https://rails.lighthouseapp.com/projects/8994/tickets/1876-uninitialized-constant-actioncontrollersessionmemorystore获取了代码

require 'action_dispatch'
module ActionDispatch
module Session
class CustomMemoryStore < ActionDispatch::Session::AbstractStore
  GLOBAL_HASH_TABLE = {} #:nodoc:

  private
    def get_session(env, sid)
      sid ||= generate_sid
      session = GLOBAL_HASH_TABLE[sid] || {}
      session = AbstractStore::SessionHash.new(self, env).merge(session)
      [sid, session]
    end

    def set_session(env, sid, session_data)
      GLOBAL_HASH_TABLE[sid] = session_data
      return true
    end
  end
 end
end
Steptools3::Application.config.session_store :custom_memory_store, :key => '_some_xyz'
Run Code Online (Sandbox Code Playgroud)

nat*_*vda 2

您可以尝试使用Redis作为会话存储。我们使用rails3-redis-session-store宝石。来源可以在这里找到。

设置非常简单,并且会话会自动过期,这使得它很安全。配置示例:

YourApp::Application.config.session_store :redis_session_store,
                                          :db => 0,
                                          :expire_after => 10.minutes,
                                          :key_prefix => "your_app:session:"
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用dalli,从而使用memcached作为后端。

希望这可以帮助。