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请求是无状态的,所以不可能知道给定的请求实际上来自登录的特定用户?这就是会话之所以重要的原因,因为它们允许应用程序跟踪登录用户从一个请求到另一个请求,直到会话到期。
- 谢谢您!你能告诉我更多关于这个部分加密的密码吗?为什么它是部分的而不是完整的?在哪里/什么时候使用?它是用在计谋上,还是用在铁轨上,还是两者兼而有之?
- (或者可以直接带我到某个地方去读这篇文章——但我在任何地方都找不到一个好的解释者)
- @约翰巴赫,请阅读我最新的答案。希望它能帮助你理解。
- 史诗般的回答——谢谢!积分!我还是有点不清楚它的目的是什么,但现在我很容易自己去探索它。(我不明白这和盐有什么关系。盐通常是与用户一起存储的字符串,用于执行单向哈希,并使被盗的哈希对猜测明文pw无效。
- Jonathanleighton.com/articles/2013/…上有一些额外的见解,关于更改密码时用于使现有会话无效的salt:新密码的salt将与存储在会话中的不同,因此会话被拒绝。有关字符串内容的详细信息,请访问stackoverflow.com/a/6833165/395180