From 17bfc16b7b94270c15a6ca062270496a45604fdd Mon Sep 17 00:00:00 2001 From: SerkanCel1k Date: Wed, 15 Apr 2026 14:24:16 +0200 Subject: [PATCH 1/2] member rol aangemaakt met eigen rechten, routes protecten en nav aangepast --- .gitignore | 3 ++ lib/mailgun_logger/roles/roles.ex | 18 ++++++++++- lib/mailgun_logger/seeder.ex | 3 +- .../plugs/require_permission.ex | 30 ++++++++++++++++++ lib/mailgun_logger_web/router.ex | 31 ++++++++++++++++--- .../templates/layout/app.html.heex | 13 ++++++-- 6 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 lib/mailgun_logger_web/plugs/require_permission.ex diff --git a/.gitignore b/.gitignore index a155b1a..06bd394 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ docker-compose.yml node_modules .serena .playwright-mcp + +.DS_Store + diff --git a/lib/mailgun_logger/roles/roles.ex b/lib/mailgun_logger/roles/roles.ex index 8a873bb..16273b0 100644 --- a/lib/mailgun_logger/roles/roles.ex +++ b/lib/mailgun_logger/roles/roles.ex @@ -7,12 +7,18 @@ defmodule MailgunLogger.Roles do @superuser_role "superuser" @admin_role "admin" + # role met limited rechten + @member_role "member" ######################################################### @default_actions ~w() - @admin_actions ~w(do_stuff) ++ @default_actions + #member kan enkel events checken + #w() maakt lijst van woorden splitsend op whitespace + @member_actions ~w(view_events) + + @admin_actions ~w(do_stuff) ++ @member_actions ++ @default_actions @superuser_actions ~w() ++ @admin_actions @@ -55,6 +61,12 @@ defmodule MailgunLogger.Roles do Enum.any?(roles, &can?(&1.name, action)) end + # rechten member rol + for action <- @member_actions do + action = String.to_atom(action) + def can?(@member_role, unquote(action)), do: true + end + for action <- @admin_actions do action = String.to_atom(action) def can?(@admin_role, unquote(action)), do: true @@ -69,6 +81,8 @@ defmodule MailgunLogger.Roles do def is?(%User{roles: roles}, :superuser), do: is(roles, "superuser") def is?(%User{roles: roles}, :admin), do: is(roles, "admin") + # check user rol + def is?(%User{roles: roles}, :member), do: is(roles, "member") def is?(_, _), do: raise("Roles.is/2 requires roles to be preloaded") defp is(roles, role) when is_binary(role), do: Enum.map(roles, & &1.name) |> Enum.member?(role) @@ -77,6 +91,8 @@ defmodule MailgunLogger.Roles do def abilities(%User{roles: roles}), do: hd(roles) |> abilities() def abilities(%Role{name: "admin"}), do: @admin_actions def abilities(%Role{name: "superuser"}), do: @superuser_actions + # mogelijkheden vr member + def abilities(%Role{name: "member"}), do: @member_actions def roles(%User{roles: roles}), do: Enum.map(roles, & &1.name) end diff --git a/lib/mailgun_logger/seeder.ex b/lib/mailgun_logger/seeder.ex index 6fe0588..c91360d 100644 --- a/lib/mailgun_logger/seeder.ex +++ b/lib/mailgun_logger/seeder.ex @@ -6,7 +6,8 @@ defmodule MailgunLogger.Seeder do # alias MailgunLogger.UserRole - @roles [%Role{name: "superuser"}, %Role{name: "admin"}] + @roles [%Role{name: "superuser"}, %Role{name: "admin"}, %Role{name: "member"}] + def run do Enum.each(@roles, &insert_if_new(&1)) diff --git a/lib/mailgun_logger_web/plugs/require_permission.ex b/lib/mailgun_logger_web/plugs/require_permission.ex new file mode 100644 index 0000000..2020247 --- /dev/null +++ b/lib/mailgun_logger_web/plugs/require_permission.ex @@ -0,0 +1,30 @@ +defmodule MailgunLoggerWeb.Plugs.RequirePermission do + import Plug.Conn + import Phoenix.Controller + alias MailgunLogger.Roles + alias MailgunLoggerWeb.Router.Helpers, as: Routes + + + @moduledoc """ + plug die checkt of huidige gebruiker de vereiste permission heeft + if false wordt gebruiker geredirect naar events page + reminder: plug (elixir) = middleware + """ + + def init(action), do: action + def call(conn, action) do + user = conn.assigns[:current_user] + + if user && Roles.can?(user, action) do + # user heeft toestemming, ga verder + conn + else + # geen permi -> redirect naar events + conn + |> put_flash(:error, "je hebt geen permissie tot deze pagina") + |> redirect(to: Routes.event_path(conn, :index)) + |> halt() + end + + end +end diff --git a/lib/mailgun_logger_web/router.ex b/lib/mailgun_logger_web/router.ex index 7297982..d010d0b 100644 --- a/lib/mailgun_logger_web/router.ex +++ b/lib/mailgun_logger_web/router.ex @@ -23,6 +23,17 @@ defmodule MailgunLoggerWeb.Router do plug(MailgunLoggerWeb.Plugs.Auth) end + # access voor member en hoger (events bekijke) + pipeline :require_events_access do + plug(MailgunLoggerWeb.Plugs.RequirePermission, :view_events) + end + + + # access alleen voor admin en superuser + pipeline :require_admin_access do + plug(MailgunLoggerWeb.Plugs.RequirePermission, :do_stuff) + end + # Always except in prod if Application.compile_env(:mailgun_logger, :env) == :dev do forward("/sent_emails", Bamboo.SentEmailViewerPlug) @@ -69,22 +80,34 @@ defmodule MailgunLoggerWeb.Router do post("/", SetupController, :create_root) end + # logout is toegankelijk voor alle users + # hoeft geen check voor :require_events_access scope "/", MailgunLoggerWeb do pipe_through([:browser, :auth]) get("/logout", AuthController, :logout) + end + + # accesible voor member en boven + scope "/", MailgunLoggerWeb do + pipe_through([:browser, :auth, :require_events_access]) + get("/", PageController, :index) + get("/non-affiliation", PageController, :non_affiliation) resources("/events", EventController, only: [:index, :show]) get("/events/:id/stored_message", EventController, :stored_message) - resources("/accounts", AccountController, except: [:show]) get("/profile", ProfileController, :edit) put("/profile", ProfileController, :update) - resources("/users", UserController, except: [:show]) + end - get("/", PageController, :index) + # alleen toegankelijk voor superuser en amdin + scope "/", MailgunLoggerWeb do + pipe_through([:browser, :auth, :require_admin_access]) + + resources("/accounts", AccountController, except: [:show]) + resources("/users", UserController, except: [:show]) post("/trigger-run", PageController, :trigger_run) get("/stats", PageController, :stats) get("/graphs", PageController, :graphs) - get("/non-affiliation", PageController, :non_affiliation) end end diff --git a/lib/mailgun_logger_web/templates/layout/app.html.heex b/lib/mailgun_logger_web/templates/layout/app.html.heex index 6a78307..daf2179 100644 --- a/lib/mailgun_logger_web/templates/layout/app.html.heex +++ b/lib/mailgun_logger_web/templates/layout/app.html.heex @@ -39,9 +39,16 @@