如何通过会话 ID 查找设备用户?

20

如果给定 session["session_id"],是否可以找到与该会话相关联的已登录User


你可以使用 User.current_user 代替... 你试过了吗? - Victor Rodrigues
3个回答

27

至少在我的系统上(rails 3.2,devise 2.0.4),您可以按如下方式执行:

session 是:

{"session_id"=>"be02f27d504672bab3408a0ccf5c1db5", "_csrf_token"=>"DKaCNX3/DMloaCHbVSNq33NJjYIg51X0z/p2T1VRzfY=", "warden.user.user.key"=>["User", [3], "$2a$10$5HFWNuz5p6fT3Z4ZvJfQq."]}

session["warden.user.user.key"][1][0],然后是 3

所以,我会将其找出:

User.find(session["warden.user.user.key"][1][0])

11
在Rails 4.2.1和Devise 3.4.1中,您需要使用User.find(session["warden.user.user.key"][0][0])来查找用户。 - Razi Shaban
谢谢。这个例子很丑,但它能工作。再次感谢。这是关于cookies的例子:http://stackoverflow.com/a/43549108/5754223 - artamonovdev

3

我不确定你想要实现什么,但我会尝试回答

如果你只想获取当前会话的用户,一个简单的方法是将他的ID存储在会话中,例如:

def login(username, pass)
  # do the usual authentication stuff and get user
  if logedin
    session[:user_id] = user.id
  end
end 

获取当前用户的代码可能如下所示:
current_user =User.find(session[:user_id])

如果您希望查找当前已登录的所有用户,我认为您需要配置您的应用程序以将会话保存在数据库中,因为预定义的是会话数据存储在浏览器中的 cookie 中。有关更多信息,请查看此答案如何在Rails中跟踪在线用户?


编辑:刚注意到您正在使用 devise,因此第一种方式实际上适用于您。您只需要在任何控制器中调用 current_user 方法即可。 对于第二种方式,请查看此答案 使用Devise在Rails中查找“在线”


2

我还想补充一点,如果你使用ActiveRecord session_store,你可以通过以下方式查找用户的所有存储会话:

ActiveRecord::SessionStore::Session.select{ |s| s.data["warden.user.user.key"] && s.data["warden.user.user.key"][0][0] == user_id }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接