Elixir 凤凰频道-控制器广播-如何找到当前用户?

Elixir 凤凰频道-控制器广播-如何找到当前用户?,elixir,phoenix-framework,phoenix-channels,Elixir,Phoenix Framework,Phoenix Channels,我有一个应用程序,其中我在submission_controller中广播一些表单提交,如下所示: Formerer.Endpoint.broadcast("forms:#{form.id}", "new_submission", payload) 但是,我现在要做的是确保只有当前用户可以访问为其表单广播的提交内容。(例如,如果表单2属于另一个用户,则当前用户将无法查看“表单:2”的提交内容) 我在channeljoin操作中通过仅为我在connect操作中分配给频道的用户id筛选表单来实现这

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

Formerer.Endpoint.broadcast("forms:#{form.id}", "new_submission", payload)
但是,我现在要做的是确保只有当前用户可以访问为其表单广播的提交内容。(例如,如果表单2属于另一个用户,则当前用户将无法查看“表单:2”的提交内容)

我在channel
join
操作中通过仅为我在connect操作中分配给频道的用户id筛选表单来实现这一点:

user = Repo.get(Formerer.User, socket.assigns.user_id)
但是对于
广播
我没有可用的
插座

我的问题是:
  • 有没有办法通过频道主题找到套接字? 比如:

    %Phoenix.Socket{assigns: %{user_id: user_id}, topic: "forms:1"} = ALL_OPEN_SOCKETS?!
    
  • 在那之后,我可以看看是否
    user\u id==submission.user\u id
    ,如果为true,则广播

  • 如果这是不可能的,那么最好的做法是什么,以确保只有当前的_用户可以访问他们提交的表单

  • 使用
    intercept
    api并为事件创建
    handle\u out
    函数。在
    handle\u out
    功能中,您将拥有插座。您可以验证存储在那里的用户id。它是正确的,
    推送套接字、事件、消息
    ,否则除了
    {: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
    事件中的任何位置进行广播,套接字将负责将事件推出有效负载中仅定义的三个用户

    既然您已经使用了
    Endpoint.broadcast/3
    ,为什么不验证客户端提交的内容呢?就像您可以在提交控制器中提交
    用户id
    以及
    有效载荷
    ,然后在将
    有效载荷
    广播到
    表单_频道
    正在收听时进行验证一样
    new_submission
    事件。这意味着仍将广播提交信息。我的难题是,如果不是正确的用户,如何阻止它们被广播。