什么是Rails / Devise会话中的监听数据?

What is the warden data in a Rails/Devise session composed of?

Rails会话中的"数据"如下所示:

1
{"warden.user.user.key" => [[1],"long-random-string"]}

1是用户ID。长随机字符串是什么?

这是铁路公司处理/使用的东西,还是设计的?


当您登录一个user(设计型号名称user)时,会创建一个密钥"warden.user.model_name.key",在您的情况下,该密钥就是"warden.user.user.key"

例如:

1
{ warden.user.user.key => [[1],"$2a$10$KItas1NKsvunK0O5w9ioWu"] }

哪里

1是登录用户的id

$2a$10$KItas1NKsvunK0O5w9ioWuaka long-random-string是标识为1的用户的部分加密密码。

您可以通过执行rails console

1
2
User.find(1).encrypted_password  
## =>"$2a$10$KItas1NKsvunK0O5w9ioWuWp4wbZ4iympYMqVCRmmvTGapktKqdMe"

更新

could you tell me a bit more about this partial encrypted password? why is it partial and not full?

为了在评论中回答您的上述问题,Devise通过调用authenticatable_salt方法将部分encrypted_password存储在会话中。Devise存储部分encrypted_password,因为它更可靠,而不是在会话中暴露完全加密的_密码(即使它是加密的)。这就是为什么提取encrypted_password的前30个字符[0,29]并存储在会话中的原因。

1
2
3
4
  # A reliable way to expose the salt regardless of the implementation.
  def authenticatable_salt
    encrypted_password[0,29] if encrypted_password
  end

您可以在这里看到可验证代码。

where/when is it used? is it used by Devise, or by Rails, or both?

Devise使用它进行身份验证,以验证特定用户是否登录。理想的用例是,特定的Rails应用程序如何跟踪用户在请求新页面时的登录方式。由于HTTP请求是无状态的,所以不可能知道给定的请求实际上来自登录的特定用户?这就是会话之所以重要的原因,因为它们允许应用程序跟踪登录用户从一个请求到另一个请求,直到会话到期。