广播时如何排除部分用户?

时间:2016-05-17 15:02:02

标签: phoenix-framework

由于broadcast!会向订阅除发件人之外的主题的所有用户发送消息,是否可以除某些用户外?或发送给特定用户?

我需要用户将事件推送到频道,但只有管理员用户才会收到消息,其他用户不会收到消息,只会发送消息。

我可以在客户端解决这个问题,只需让用户忽略他们通过broadcast!收到的消息,只有管理员用户处理收到的消息,但是如何在服务器端解决这个问题?

简而言之,加入频道,但可以只读,还是仅发送?

1 个答案:

答案 0 :(得分:1)

如果您按照https://hexdocs.pm/phoenix/Phoenix.Token.html

中的说明将用户存储在套接字上
defmodule MyApp.UserSocket do
  use Phoenix.Socket

  def connect(%{"token" => token}, socket) do
    case Phoenix.Token.verify(socket, "user", token, max_age: 1209600) do
      {:ok, user_id} ->
        socket = assign(socket, :user, Repo.get!(User, user_id))
        {:ok, socket}
      {:error, _} -> #...
    end
  end
end

然后,您可以在频道documented herehandle_out功能中查看用户管理状态:

defmodule HelloPhoenix.RoomChannel do
  intercept ["new_msg"]
  ...
  def handle_out("new_msg", payload, socket) do
    if socket.assigns.user.admin do
      push socket, "new_msg", payload
    end
    {:noreply, socket}
  end
end

根据您的邮件量和管理员数量,您可以考虑为这些活动设置特定于管理员的渠道。这样可以防止将消息发送到非管理员用户的进程,而不是简单地忽略它们。