如果存儲插槽上的用戶在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
解釋然後,您可以檢查用戶在handle_out
功能管理狀態爲自己的頻道documented here:
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
根據您的消息量和管理員數量,您可以考慮爲這些事件設置特定於管理員的頻道。這將防止消息被髮送到非管理員用戶的進程,而不是簡單地忽略它們。
即使我專門爲管理員設置一個頻道,其他用戶也會加入到發送他們的消息給管理員,那麼我將不得不忽略非管理員用戶在handle_out ..所以其相同的..對嗎? – simo
您可以擁有隻有管理員加入的頻道。無論消息如何發送,都可以廣播消息。所以你會保留現有的頻道,然後使用MyApp.Endpoint.broadcast從那裏廣播到管理頻道。 https://hexdocs.pm/phoenix/Phoenix.Endpoint.html – Gazler
謝謝,這正是我需要的,推送消息沒有套接字上下文。 – simo