How can I pass session from conn to live_dashboard custom page

I want to add a custom page for live_dashboard to show logged user information.
I assigned conn with current_user by plug admin_basic_auth but I only get an empty session list at NotificationPage mount function

# lib/search_box_web/router.ex

  pipeline :admins_only do
    plug :fetch_session
    plug :admin_basic_auth
  end

  defp admin_basic_auth(conn, _opts) do
    user_id = get_session(conn, :user_id)
    not_found = fn(conn) -> conn |> Plug.Conn.send_resp(404, "not found") |> halt() end
    if user_id != nil do
      case Repo.get(User, user_id) do
        nil -> not_found.(conn)
       user -> assign(conn, :current_user, user)
      end
    else
      not_found.(conn)
    end
...
        scope "/admin" do
          pipe_through [:protect_from_forgery, :admins_only]
          live_dashboard "/dashboard",
            metrics: SearchBoxWeb.Telemetry,
            ecto_repos: [SearchBox.Repo],
            additional_pages: [
              notification_page: SearchBoxWeb.Live.NotificationPage
            ]

        end
defmodule SearchBoxWeb.Live.NotificationPage do
  @moduledoc false
  use Phoenix.LiveDashboard.PageBuilder

  alias SearchBox.User
  alias SearchBox.Repo

  @impl true
  def menu_link(_, _) do
    {:ok, "Notifications"}
  end

  @impl true
  def mount(unsigned_params, session, socket) do
    IO.inspect(unsigned_params) #=> %{"page" => "notification_page"}
    IO.inspect(session) #=> []
    ... 
    { :ok, assign_new(socket, :current_user, fn -> lookup_user(user_id) end) }
  end
...
end
1 Like

You can get the session information by get_connect_info/1
But I’m not sure if this is the best option

  def mount(_unsigned_params, _session, socket) do
    user_id =
      get_connect_info(socket)
      |> get_in([:session, "user_id"])

    if user_id do
      { :ok, assign_new(socket, :current_user, fn -> Repo.get(User, user_id) end) }
    end
   ...
  end