如果您按照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 here 的handle_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
根据您的消息量和管理员数量,您可以考虑为这些事件设置一个特定于管理员的频道。这将防止消息被发送到非管理员用户的进程,而不是简单地忽略它们。