Packages
pow
1.0.24
1.0.39
1.0.38
1.0.37
1.0.36
1.0.35
1.0.34
1.0.33
1.0.32
1.0.31
1.0.30
1.0.29
1.0.28
1.0.27
1.0.26
1.0.25
1.0.24
1.0.23
1.0.22
1.0.21
1.0.20
1.0.19
1.0.18
1.0.17
1.0.16
1.0.15
1.0.14
1.0.13
1.0.12
1.0.11
1.0.10
1.0.9
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
1.0.0-rc.4
1.0.0-rc.3
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.1.0-rc.1
0.1.0-alpha.8
0.1.0-alpha.7
retired
0.1.0-alpha.6
0.1.0-alpha.5
0.1.0-alpha.4
0.1.0-alpha.3
0.1.0-alpha.2
0.1.0-alpha.1
0.1.0-alpha
Robust user authentication solution
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/pow/phoenix/controllers/session_controller.ex
defmodule Pow.Phoenix.SessionController do
@moduledoc """
Controller actions for session.
The `:request_path` param will automatically be assigned in `:new` and
`:create` actions, and used for the `pow_session_path(conn, :create)` path.
"""
use Pow.Phoenix.Controller
alias Plug.Conn
alias Pow.Plug
plug :require_not_authenticated when action in [:new, :create]
plug :require_authenticated when action in [:delete]
plug :assign_request_path when action in [:new, :create]
plug :assign_create_path when action in [:new, :create]
plug :put_no_cache_header when action in [:new]
@doc false
@spec process_new(Conn.t(), map()) :: {:ok, map(), Conn.t()}
def process_new(conn, _params) do
{:ok, Plug.change_user(conn), conn}
end
@doc false
@spec respond_new({:ok, map(), Conn.t()}) :: Conn.t()
def respond_new({:ok, changeset, conn}) do
conn
|> assign(:changeset, changeset)
|> render("new.html")
end
@doc false
@spec process_create(Conn.t(), map()) :: {:ok | :error, Conn.t()}
def process_create(conn, %{"user" => user_params}) do
Plug.authenticate_user(conn, user_params)
end
@doc false
@spec respond_create({:ok | :error, Conn.t()}) :: Conn.t()
def respond_create({:ok, conn}) do
conn
|> put_flash(:info, messages(conn).signed_in(conn))
|> redirect(to: routes(conn).after_sign_in_path(conn))
end
def respond_create({:error, conn}) do
conn
|> assign(:changeset, Plug.change_user(conn, conn.params["user"]))
|> put_flash(:error, messages(conn).invalid_credentials(conn))
|> render("new.html")
end
@doc false
@spec process_delete(Conn.t(), map()) :: {:ok, Conn.t()}
def process_delete(conn, _params), do: {:ok, Plug.delete(conn)}
@doc false
@spec respond_delete({:ok, Conn.t()}) :: Conn.t()
def respond_delete({:ok, conn}) do
conn
|> put_flash(:info, messages(conn).signed_out(conn))
|> redirect(to: routes(conn).after_sign_out_path(conn))
end
defp assign_request_path(%{params: %{"request_path" => request_path}} = conn, _opts) do
Conn.assign(conn, :request_path, request_path)
end
defp assign_request_path(conn, _opts), do: conn
defp assign_create_path(conn, _opts) do
Conn.assign(conn, :action, create_path(conn))
end
defp create_path(%{assigns: %{request_path: request_path}} = conn) do
create_path(conn, request_path: request_path)
end
defp create_path(conn, query_params \\ []) do
routes(conn).path_for(conn, __MODULE__, :create, [], query_params)
end
end