用于"当前用户"的websocket频道

时间:2016-03-25 18:23:40

标签: ruby-on-rails ruby security websocket websocket-rails

使用websocket-rails,我可以使用。{ 跟随我的控制器中的代码来试图使用websocket发布事件:

WebsocketRails[:channel_name].trigger('event_name', { foo: "bar" }.to_json)

我的目标是仅为当前用户创建pub-sub频道。举个例子 事件"发送了新的聊天消息"。我想把这个事件只推送到接收者的频道。

我目前正在根据每个用户的ID为其创建一个唯一的频道名称。 我将以下代码放在我的控制器中(定义了current_user 其他方法:

WebsocketRails[:"user#{current_user.id}"].trigger("event_name", { foo: "bar" }.to_json)

然后在我的Javascript中,我使用以下内容将当前用户订阅到他们自己的频道:

<% if @current_user %>
  var dispatcher = new WebSocketRails('localhost:3000/websocket');
  channel = dispatcher.subscribe('user<%= @current_user.id %>'); 
  channel.bind('event_name', function(data) {
    console.log(data)
  });
<% end %>

它的要点是使用字符串插值为每个用户创建一个新频道,即 user12user123个频道。

问题是这不是很安全。任何用户都可以访问其他任何人 私有频道只是粘贴一些Javascript。例如,如果用户#1想要 要访问用户#2的新闻Feed,他们只需输入dispatcher.subscribe('user2')

您如何解决这个问题?是否有另一个具有此功能的pub-sub库 内置于它?

查看WebsocketRails&#39; wiki entry关于这个问题, 我尝试将follolwing代码添加到config / initializers / websockets.rb

WebsocketRails::EventMap.describe do
  namespace :websocket_rails do
    subscribe :subscribe_private, to: ConnectionsController, with_method: :authorize_channels
  end
end

以下是app / controllers / connections_controller.rb

class ConnectionsController < WebsocketRails::BaseController
  def authorize_channels
    channel_name = WebsocketRails[message[:channel]]
    current_user = User.find_by(id: session["current_user_id"])
    if current_user && "user#{current_user.id}".eql?(channel_name)
      accept_channel current_user
    else
      deny_channel({ message: "auth failed" })
    end
  end
end

然后在其他地方,我打电话给WebsocketRails[:"user#{@current_user.id}"].make_private

但这似乎没有任何效果。

0 个答案:

没有答案