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

Joh*_*hir 20 ruby-on-rails devise warden

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

{"warden.user.user.key" => [[1], "long-random-string"]}
Run Code Online (Sandbox Code Playgroud)

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

这是由Rails或Devise处理/使用的东西吗?

Kir*_*rat 36

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

例如:

{ warden.user.user.key => [[1], "$2a$10$KItas1NKsvunK0O5w9ioWu"] }
Run Code Online (Sandbox Code Playgroud)

哪里

1id登录用户的.

$2a$10$KItas1NKsvunK0O5w9ioWuaka long-random-string是具有id的用户的部分加密密码1.

您可以通过继续rails console执行来验证这一点

User.find(1).encrypted_password  
## => "$2a$10$KItas1NKsvunK0O5w9ioWuWp4wbZ4iympYMqVCRmmvTGapktKqdMe"
Run Code Online (Sandbox Code Playgroud)

UPDATE

你能告诉我一些关于这个部分加密密码的信息吗?为什么它偏而不饱?

要在注释中回答上述问题,请通过调用方法Devise将部分存储encrypted_password在会话中authenticatable_salt.Devise存储部分encrypted_password因为它更可靠而不是在会话中暴露完整的encrypted_pa​​ssword(即使它是加密的).这就是为什么前30个字符[0,29]encrypted_password提取和存储在会话.

  # A reliable way to expose the salt regardless of the implementation.
  def authenticatable_salt
    encrypted_password[0,29] if encrypted_password
  end
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到authenticatable_salt的代码.

它何时/何​​时使用?是由Devise,还是由Rails使用,还是两者兼用?

Devise用于验证目的,以验证特定用户是否已登录.理想的用例是,特定的Rails应用程序如何跟踪用户在请求新页面时的登录方式.由于HTTP请求是无状态的,因此无法确定给定的请求是否实际来自登录的特定用户?这就是会话很重要的原因,因为它们允许应用程序在会话到期之前将登录用户的跟踪从一个请求跟踪到另一个请求.