使用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 %>
它的要点是使用字符串插值为每个用户创建一个新频道,即
user12
和user123
个频道。
问题是这不是很安全。任何用户都可以访问其他任何人
私有频道只是粘贴一些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
但这似乎没有任何效果。