Elixir 凤凰频道-控制器广播-如何找到当前用户?
我有一个应用程序,其中我在submission_controller中广播一些表单提交,如下所示: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筛选表单来实现这
Formerer.Endpoint.broadcast("forms:#{form.id}", "new_submission", payload)
但是,我现在要做的是确保只有当前用户可以访问为其表单广播的提交内容。(例如,如果表单2属于另一个用户,则当前用户将无法查看“表单:2”的提交内容)
我在channeljoin
操作中通过仅为我在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
事件。这意味着仍将广播提交信息。我的难题是,如果不是正确的用户,如何阻止它们被广播。