2

我有一个应用程序,我在 submit_controller 中广播了一些表单提交,如下所示:

Formerer.Endpoint.broadcast("forms:#{form.id}", "new_submission", payload)

但是,我现在尝试做的是确保只有 current_user 才能访问为其表单广播的提交。(例如,如果表单 2 属于另一个用户,current_user 将无法查看“forms:2”的提交)。

join通过仅过滤我在连接操作中分配给通道的用户 ID 的表单来设法在通道操作中执行此操作:

user = Repo.get(Formerer.User, socket.assigns.user_id)

但是对于broadcast我没有socket可用的。

我的问题:

  1. 有没有办法通过频道主题以某种方式找到套接字?就像是:

    %Phoenix.Socket{assigns: %{user_id: user_id}, topic: "forms:1"} = ALL_OPEN_SOCKETS?!
    

之后我可以看看是否user_id == submission.user_id,如果为真则广播

  1. 如果这是不可能的,那么最好的做法是什么,并确保只有 current_user 可以访问他们的表单提交?
4

1 回答 1

0

使用interceptapi 并handle_out为事件创建一个函数。在handle_out函数中,您将拥有套接字。您可以验证存储在那里的 user_id。它是正确的push socket, event, message,否则除了 之外什么都不做{:ok, socket}

编辑

这是一个代码示例:

defmodule MyApp.Web.UserChannel do
  Use MyApp.Web, :channel

  intercept ["new_submission"]

  def handle_out("new_submission", msg, socket) do
    if msg[:user_id] == socket.assigns[:user_id] do
      push socket, "new_submission, msg
    end
    {:noreply, socket}
  end
end

然后你可以在new_submission任何地方广播事件,套接字将通道将负责将事件推送到有效负载中定义的三个用户。

于 2017-04-14T03:23:48.483 回答