Fold RequireLogin plug into Auth module

This commit is contained in:
Claudio Ortolina
2024-12-22 16:08:40 +00:00
parent 341d276db5
commit cf3761ca79
5 changed files with 36 additions and 52 deletions
+15
View File
@@ -1,4 +1,8 @@
defmodule MusicLibraryWeb.Auth do
use Gettext, backend: MusicLibraryWeb.Gettext
import Plug.Conn
import Phoenix.Controller, only: [put_flash: 3, redirect: 2]
def correct_login_password?(password) do
Plug.Crypto.secure_compare(correct_login_password(), password)
end
@@ -7,4 +11,15 @@ defmodule MusicLibraryWeb.Auth do
Application.get_env(:music_library, MusicLibraryWeb)
|> Keyword.fetch!(:login_password)
end
def require_logged_in(conn, _opts) do
if get_session(conn, :logged_in) do
conn
else
conn
|> put_flash(:error, gettext("You must be logged in to access this page"))
|> redirect(to: "/login")
|> halt()
end
end
end
@@ -1,22 +0,0 @@
defmodule MusicLibraryWeb.Plug.RequireLogin do
@behaviour Plug
use Gettext, backend: MusicLibraryWeb.Gettext
import Plug.Conn
import Phoenix.Controller, only: [put_flash: 3, redirect: 2]
@impl true
def init(opts), do: opts
@impl true
def call(conn, _opts) do
if get_session(conn, :logged_in) do
conn
else
conn
|> put_flash(:error, gettext("You must be logged in to access this page"))
|> redirect(to: "/login")
|> halt()
end
end
end
+6 -9
View File
@@ -1,6 +1,8 @@
defmodule MusicLibraryWeb.Router do
use MusicLibraryWeb, :router
import MusicLibraryWeb.Auth, only: [require_logged_in: 2]
pipeline :browser do
plug :accepts, ["html"]
plug :fetch_session
@@ -14,8 +16,8 @@ defmodule MusicLibraryWeb.Router do
plug :accepts, ["json"]
end
pipeline :require_login do
plug MusicLibraryWeb.Plug.RequireLogin
pipeline :logged_in do
plug :require_logged_in
end
scope "/", MusicLibraryWeb do
@@ -26,7 +28,7 @@ defmodule MusicLibraryWeb.Router do
post "/sessions/create", SessionController, :create
scope "/" do
pipe_through :require_login
pipe_through :logged_in
get "/covers/:record_id", CoverController, :show
@@ -56,11 +58,6 @@ defmodule MusicLibraryWeb.Router do
get "/collection/latest", CollectionController, :latest
end
# Other scopes may use custom stacks.
# scope "/api", MusicLibraryWeb do
# pipe_through :api
# end
# Enable LiveDashboard in development
if Application.compile_env(:music_library, :dev_routes) do
# If you want to use the LiveDashboard in production, you should put
@@ -71,7 +68,7 @@ defmodule MusicLibraryWeb.Router do
import Phoenix.LiveDashboard.Router
scope "/dev" do
pipe_through [:browser, :require_login]
pipe_through [:browser, :logged_in]
live_dashboard "/dashboard",
metrics: MusicLibraryWeb.Telemetry,
+1 -1
View File
@@ -335,7 +335,7 @@ msgstr ""
msgid "Wishlist"
msgstr ""
#: lib/music_library_web/plug/require_login.ex:17
#: lib/music_library_web/auth.ex:20
#, elixir-autogen, elixir-format
msgid "You must be logged in to access this page"
msgstr ""
@@ -1,28 +1,23 @@
defmodule MusicLibraryWeb.Plug.RequireLoginTest do
defmodule MusicLibraryWeb.AuthTest do
use ExUnit.Case, async: true
use Plug.Test
alias MusicLibraryWeb.Plug.RequireLogin
alias MusicLibraryWeb.Auth
defp setup_conn(config) do
Map.put(
config,
:conn,
defp setup_conn(_config) do
conn =
conn(:get, "/any-path")
|> Phoenix.ConnTest.init_test_session(%{})
|> Phoenix.ConnTest.fetch_flash()
)
%{conn: conn}
end
defp authenticate(%{conn: conn} = config) do
Map.put(config, :conn, Phoenix.ConnTest.init_test_session(conn, %{logged_in: true}))
end
describe "when logged out" do
describe "require_logged_in/2" do
setup [:setup_conn]
test "it redirects to /login", %{conn: conn} do
conn = RequireLogin.call(conn, [])
test "when logged out, it redirects to /login", %{conn: conn} do
conn = Auth.require_logged_in(conn, [])
{"location", location} =
conn.resp_headers
@@ -34,13 +29,12 @@ defmodule MusicLibraryWeb.Plug.RequireLoginTest do
assert location == "/login"
assert conn.assigns.flash == %{"error" => "You must be logged in to access this page"}
end
end
describe "when logged in" do
setup [:setup_conn, :authenticate]
test "it passes through", %{conn: conn} do
conn = RequireLogin.call(conn, [])
test "when logged in, it passes through", %{conn: conn} do
conn =
conn
|> Phoenix.ConnTest.init_test_session(%{logged_in: true})
|> Auth.require_logged_in([])
assert conn.status == nil
assert conn.state == :unset