Rails Action Cable:如何获取用户代理和客户端IP地址?

Rails Action Cable: How to fetch User Agent & Client IP Address?

我正在升级 Rails 应用程序以通过 Action Cable 使用 websocket。出于日志目的,我需要获取客户端的 IP 地址和发送套接字消息的用户代理。

MyChannelclass(app/channels/my_channel.rb)的speak方法中,我无法访问会话或请求。

你知道我如何在这个 speak 方法中获取 user_agent 和客户端 IP 地址吗?

您可以从 Channel 所属的 Connection 对象中的请求中获取此信息。

ActionCable::Connection::Base包含了当前连接环境的所有信息(HTTPheaders,rack进程等),可以通过它的env属性reader.

例如,这是我如何获得在建立 WebSocket 连接时使用的 User-Agent HTTP header:

user_agent = connection.env["HTTP_USER_AGENT"]

请注意,我 运行 此代码来自 ApplicationCable::Channel 实例,其中连接实例可通过 connection 属性获得

我找不到任何关于它的文档,但我相信它是安全的,因为 env 属性是公开可用的 (https://api.rubyonrails.org/v5.1.6/classes/ActionCable/Connection/Base.html#method-i-request)。您可以在控制台中通过 运行ning connection.env.keys 获取此散列包含的键的完整列表(显然,当 connection 实例可用时)。

要使用 remote_ip 助手,您可以在您的频道中执行此操作:

ActionDispatch::Request.new(connection.env).remote_ip