我想为Rails应用程序提供身份验证机制。 我计划这样做:
1. 显示登录页面 2. 获取用户名和密码 3. 存储用户名和密码 4. 手动进行身份验证,可以通过warden.authenticate或authlogic.something执行(或者甚至不需要,只需检查会话中是否有存储的内容) 5. 然后当用户执行某些操作时,我传递之前存储的用户名和密码。
现在我的问题是,我应该在哪里存储密码? 如果我使用会话,我显然不能使用cookie存储,我可以使用session_store = :active_record_store,但不确定它是否安全,而且我现在没有任何数据库,所以为什么我要创建一个只是为了会话的数据库? 是否有其他机制可以在会话中存储密码?(显然是安全的)
早期的Rails有:
1. MemoryStore 2. FileStore 但现在似乎都被删除了。还有其他解决方案吗?
答案附注:
- 存储加密密码行不通,因为在进行API调用时需要将原始密码发送到服务器。
- 我无法控制API,因此无法更改其身份验证。
- Rails应用程序中没有用户配置文件维护。一切都由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'