Files
Archivum/docs/AUTHENTIK_SETUP.md
Bjorn Blomberg cd588197b9
All checks were successful
build-and-push / build (push) Successful in 15m15s
feat: Authentik OIDC SSO, allow/deny RBAC, admin console & Gitea CI
Authentication & RBAC
- Add confidential OIDC client (Authentik) with /auth/oidc/login +
  /auth/oidc/callback: discovery, code exchange, id_token verify (go-oidc),
  groups claim → role (Archivum-admin → admin, else user). Sessions carry groups.
- Rework ACL into an allow/deny model (new `effect` column + migration).
  db.EffectiveAccess resolves user + all groups over the path and its ancestors:
  default deny, explicit deny always beats allow.
- Enforce ACL for ALL non-admin users (not just guest) across list/read/save/
  delete/move/create/history/diff/images/upload. Admins bypass.
- Seed built-in Archivum-admin / Archivum-reader groups; login allow-list on
  users & groups; public (guest) user access is ACL-configurable.

Admin API & UI
- New GraphQL ops: oidcConfig/updateOidcConfig, group CRUD, membership,
  setUserRole/setUserLogin/setGroupLogin, userGroups, loginOptions.
- Rebuilt AdminView: SSO config, user/group management + membership, login
  toggles, and an allow/deny access-control matrix per path.
- LoginView: "Sign in with Authentik" + public-user option; OIDC callback route.

Rendering/editor
- Fix bug where inline marks (bold/italic/code/strike/link) were dropped on
  TipTap→AsciiDoc save. Add RENDERING_IMPROVEMENTS.md with proposals.

CI / build
- .gitea/workflows/build.yaml: build on the Pi5 runner, push
  localhost:5000/archivum:{latest,<sha>}. Add .dockerignore; bump Go image to 1.25.
- Docs: ARCHITECTURE.md, README.md, docs/AUTHENTIK_SETUP.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-05 21:58:50 +02:00

4.7 KiB

Authentik (OIDC) + RBAC setup för Archivum

Archivum autentiserar via OIDC mot Authentik (samma mönster som Gitea och Gym-API i den här miljön). Authentik autentiserar i sin tur mot OpenLDAP, så det är dina LDAP-användare som loggar in. Grupp-medlemskap kommer med i groups-claimet och styr roll + åtkomst i Archivum.

Två saker måste finnas: (1) grupperna i katalogen och (2) en OAuth2/OIDC-provider + application i Authentik. Steg nedan.


1. Skapa grupperna

Skapa två grupper (i Authentik → Directory → Groups, eller i LDAP under ou=groups,dc=brasse-pc,dc=eu som groupOfNames):

Grupp Effekt i Archivum
Archivum-admin Full admin — administrerar sidan, tilldelar åtkomst, kringgår ACL
Archivum-reader Vanlig inloggad användare — ser bara det som ACL uttryckligen tillåter

Lägg dig själv (bb01) i Archivum-admin. Namnen kan ändras i Archivums admin-panel (fälten Admin group / Reader group) om du vill.

Grupperna syns i Archivums admin-panel så fort en medlem loggat in en gång — Archivum-admin/Archivum-reader seedas dessutom automatiskt vid start.

2. Skapa en OAuth2/OIDC-provider i Authentik

Authentik → Applications → Providers → Create → OAuth2/OpenID Provider:

Fält Värde
Name archivum
Authorization flow ditt vanliga default-authorization-flow (explicit/implicit consent)
Client type Confidential
Client ID (kopiera — behövs i Archivum)
Client Secret (kopiera — behövs i Archivum)
Redirect URIs https://archivum.brasse-pc.eu/auth/oidc/callback
Signing Key din vanliga certifikatnyckel
Scopes openid, profile, email + en groups-scope (se nedan)

groups-scope (viktigt)

Archivum läser gruppnamn ur groups-claimet. Återanvänd samma scope-mapping-mönster som Gitea/Jellyfin redan använder, eller skapa en enkel:

Authentik → Customization → Property Mappings → Create → Scope Mapping:

  • Name: archivum-groups
  • Scope name: groups
  • Expression:
    return [group.name for group in user.ak_groups.all()]
    

Lägg till den scope-mappingen i providerns Scopes.

3. Skapa applikationen + binda åtkomst

Authentik → Applications → Create:

  • Name: Archivum, Slug: archivum
  • Provider: archivum (den du nyss skapade)

Issuer-URL blir då:

https://authentik.brasse-pc.eu/application/o/archivum/

Bind vilka som får nå appen (Application → Policy/Group/User Bindings) — t.ex. bara Archivum-admin + Archivum-reader. Det är den primära grinden för vem som kan logga in; Archivums egen login-lista är ett andra lager.

4. Konfigurera Archivum

Logga in som den lokala admin som skapades i setup-guiden → Admin Settings → Single Sign-On (Authentik / OIDC):

Fält Värde
Enable
Issuer URL https://authentik.brasse-pc.eu/application/o/archivum/
Client ID (från steg 2)
Client Secret (från steg 2)
Public URL https://archivum.brasse-pc.eu
Admin group Archivum-admin
Reader group Archivum-reader
Groups claim groups
Username claim preferred_username

Spara. Statusen ska bli "Provider connected ✓" (Archivum gör OIDC-discovery mot issuern). Login-sidan visar nu "Sign in with Authentik".

Redirect-URI:n som Archivum använder visas i panelen — den måste matcha exakt det du la in i Authentik-providern.


Så fungerar rollen + åtkomsten

  • Medlem i Archivum-admin → roll admin → ser/gör allt, administrerar sidan.
  • Alla andra inloggade (t.ex. Archivum-reader) → styrs helt av åtkomstreglerna (ACL) i admin-panelen. Standard = deny.
  • Publik användare ("Continue as public user" på login-sidan) → anonym, ser bara det admin uttryckligen delat.

Åtkomstmodell (allow / deny)

I Admin Settings → Access Control: välj en användare eller grupp och lägg regler per sökväg (dokument-slug eller mapp).

  • allow ger en rättighet på en sökväg och allt under den.
  • deny vinner alltid över allow (kombineras över användarens alla grupper och överliggande mappar).
  • Finns ingen regel alls → deny (default).

Exempel: ge Archivum-reader allow read+view på mappen handbok, men lägg deny readhandbok/hemligt för samma grupp → de ser hela handboken utom den hemliga delen.

Reverse proxy (NPM)

Lägg upp archivum.brasse-pc.eu → Archivum-containern (port 4000) i NPM med Let's Encrypt, precis som övriga tjänster. OIDC-redirecten kräver att appen nås på den publika HTTPS-URL:en som är registrerad i Authentik.