Provides a development-only account switcher for Phoenix applications.

The runtime is provided by the package itself. The generator only wires the shared runtime into an application and does not create application-specific modules.

Generator

Run the generator from a Phoenix application:

mix phx.gen.any_login Accounts users

The arguments are an existing context module and the users table name. The application's UserAuth module must expose log_in_user/2 (as generated by mix phx.gen.auth).

Useful options:

mix phx.gen.any_login Accounts users --web MyAppWeb --auth MyAppWeb.UserAuth

For a non-standard schema location, pass its full module name explicitly:

mix phx.gen.any_login Accounts users --schema MyApp.Accounts.User

It updates the application automatically:

  • configures the repository, schema, and authentication module
  • adds the AnyLogin Plug to the browser pipeline
  • adds the account-switcher route under /dev
  • renders the component in the root layout

The integration is idempotent, so rerunning the generator does not duplicate these additions. Pass --no-inject to print manual integration instructions without modifying the project.

Generated Integration

For local development, add the package using a path dependency:

def deps do
  [
    {:any_login, path: "../any_login"}
  ]
end

Then fetch dependencies and run the generator from the Phoenix application:

mix deps.get
mix phx.gen.any_login Accounts users

The generator adds this development configuration:

config :any_login,
  repo: MyApp.Repo,
  schema: MyApp.Accounts.User,
  auth: MyAppWeb.UserAuth

That command performs the complete integration. The resulting browser pipeline contains:

pipeline :browser do
  plug :accepts, ["html"]
  plug :fetch_session
  plug :fetch_live_flash
  plug :put_root_layout, html: {MyAppWeb.Layouts, :root}
  plug :protect_from_forgery
  plug :put_secure_browser_headers
  plug :fetch_current_scope_for_user
  plug AnyLogin.Plug,
    enabled: Application.compile_env(:my_app, :dev_routes, false)
end

The development-only route is added as:

if Application.compile_env(:my_app, :dev_routes, false) do
  scope "/dev", AnyLogin do
    pipe_through :browser

    post "/account-switcher", Controller, :switch
  end
end

The shared component is added to the root layout:

<%= if assigns[:any_login_enabled] do %>
  <AnyLogin.Component.account_switcher
    users={@any_login_users}
    current_user={assigns[:current_scope] && assigns[:current_scope].user}
    return_to={@any_login_return_to}
  />
<% end %>

Start the application normally:

mix phx.server

The switcher appears in the bottom-left corner only when :dev_routes is enabled.

Installation

If available in Hex, the package can be installed by adding any_login to your list of dependencies in mix.exs:

def deps do
  [
    {:any_login, "~> 0.1.0"}
  ]
end

Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/any_login.