通过Devise身份验证系统中的SessionID(cookie)获取任何用户

时间:2014-09-02 05:55:41

标签: ruby-on-rails cookies devise sessionid

一段JavaScript代码在初始化WebSockets连接时发送UserId。这需要将UserId从Rails视图传递到JavaScript源。

我不喜欢这个解决方案有两个原因:

  • 我希望JS代码完全位于*.js文件中,而不必将其部分包含在布局中
  • UserId很容易伪造并收听发送给其他用户的邮件

更好的解决方案显而易见:在任何情况下,来自经过身份验证的用户的每个WebSocket连接都伴随着cookie中的Devise的SessionID。我已经找到了如何从握手数据中提取这个cookie,现在有一个问题:

WebSockets侦听器在后台线程中不断运行,无论某个用户是否经过身份验证。因此,它无法访问用户的会话。

问题:

如果我未经过身份验证,如何通过SessionID获取用户或UserId。 Devise是否在我可以访问的内存中有一些SessionID存储(可能有一些讨厌的黑客攻击)。

1 个答案:

答案 0 :(得分:0)

在用户会话中设计warden存储的东西。因此,如果您无权访问该会话,则此单独线程中的user_id也没有。

由于您在脚本中无论如何都要公开user_id,因此您只需将其设置为其他cookie即可。

你也可以实现一个返回id的api enpoint。

您可以在一些不可见的数据中将其呈现在页面中 - '属性

<body data-user-id='asfasdfeefifpf'> ... </body>.

或者至少你可以将代码保存在js partial中,它设置id并将lib代码解压缩到单独的文件中。

 <%= javascript_tag do %>
   window.user_id = '<%= j current_user.id %>';
 <% end %>

http://railscasts.com/episodes/324-passing-data-to-javascript?view=asciicast