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>
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-readerseedas 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 read på handbok/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.