【发布时间】:2016-11-20 02:40:11
【问题描述】:
我有一个应用程序,我在 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 可用。
我的问题:
-
有没有办法通过频道主题找到套接字? 类似:
%Phoenix.Socket{assigns: %{user_id: user_id}, topic: "forms:1"} = ALL_OPEN_SOCKETS?!
之后我可以查看user_id == submission.user_id是否为真,如果为真则广播
- 如果无法做到这一点,最好的做法是什么,并确保只有 current_user 才能访问他们提交的表单?
【问题讨论】:
-
既然您已经使用了
Endpoint.broadcast/3,为什么您不验证来自客户端的提交。就像您可以在您的submission_controller 中提交您的user_id和您的payload,然后您验证它当将payload广播到form_channel时正在监听new_submission事件。 -
表示提交信息仍会被广播。如果不是正确的用户,我的困境是如何阻止它们被广播。
标签: elixir phoenix-framework phoenix-channels