Ga naar inhoud

Rollen & toegang

Doel

Dit hoofdstuk beschrijft welke gebruikersrollen op de frontend relevant zijn, wat elke rol ziet en mag, en via welke mechanismen content wordt afgeschermd. Het is de basis voor alle rolafhankelijke acceptatiecriteria in de scherm-hoofdstukken.

Frontend-relevante rollen

Rol (slug) Naam Gebruikers (aug 2026) Frontend-betekenis
(geen) Anoniem Publieke bezoeker; paywall dicht, afgeschermde routes 401/403/404
subscriber Subscriber 8 Kan inloggen (GB-lid); geen toegang tot uitgaven, paywall blijft dicht
wv-subscriber WV Abonnee 6.568 Digitale Waarheidsvriend: uitgaven-archief + flipbook + PDF; paywall-artikelen volledig leesbaar
pastor Predikant 645 Toegang tot /predikant-gegevens/ (eigen profiel bewerken); verschijnt in de publieke predikantenlijst
administrator, gb-admin, wv-admin, tr-admin, cgc-admin Beheerrollen 1+4+6+5+3 Alleen admin-bar-uitzondering op de frontend; géén impliciete toegang tot uitgaven of predikant-gegevens

Overige rollen in de database (editor, editor-cgc, sermon-controller, wh-subscriber, SEO- en ad-rollen) hebben geen frontend-gedrag; sermon-controller en wh-subscriber zijn restanten zonder code-referenties. Rollen zijn combineerbaar: een gebruiker met pastor én wv-subscriber krijgt de vereniging van beide.

De rol wv-subscriber wordt automatisch beheerd door de periodieke abonnee-import (WP All Import): gebruikers in het importbestand krijgen de rol, gebruikers die er niet meer in staan verliezen hem. Toegang is dus puur rolgestuurd en per direct.

Wat elke rol ziet (matrix)

Gedrag / route Anoniem subscriber wv-subscriber pastor Beheerrollen
Topbar/header "Inloggen"-link dropdown dropdown dropdown dropdown
Accountdropdown-items Wachtwoord wijzigen, Uitloggen Waarheidsvriend digitaal, Mijn account, Wachtwoord wijzigen, Uitloggen Mijn account, Predikant gegevens, Wachtwoord wijzigen, Uitloggen afhankelijk van rollen
Redirect na login /account/ /uitgaven/ /account/ /account/
/uitgaven/ en /uitgaven/⟨slug⟩/ 403 403 200 403 403
Paywall-artikelen (403 van 8.728 WV-artikelen) afgekapt bij marker afgekapt volledig afgekapt afgekapt
/predikant-gegevens/ 403 403 403 200 403
/account/, /wachtwoord-wijzigen/ 200 + melding "U moet ingelogd zijn…" formulier formulier formulier formulier
Nieuwsbrief-editie-URL's 404 preview preview preview preview
Afgeschermde REST-routes (/wp/v2/wv-articles e.a.) 401 200 (gb_locked: true) 200 (gb_locked: false) 200 (gb_locked: true) 200 (gb_locked: true)
Admin bar zichtbaar verborgen verborgen zichtbaar

Afschermingsmechanismen

1. Artikel-paywall (WV-artikelen)

  • De artikelbody is opgebouwd uit ACF-componenten; een redacteur plaatst een paywall-marker (component-layout paywall) in de reeks. Bij het renderen stopt de weergave op de marker voor iedereen die niet vrijgesteld is; alles vóór de marker (chapeau, titel, intro, auteur, beeld) blijft zichtbaar. De tekst ná de marker staat niet in de HTML-bron.
  • Vrijgesteld is wie (a) is ingelogd met rol wv-subscriber, of (b) het artikelgebonden nieuwsbriefcookie heeft: na inzending van het paywall-nieuwsbriefformulier wordt cookie subscribed-to-newsletter (waarde = base64 van het post-ID, 10 jaar geldig) gezet en de bezoeker teruggeleid; het cookie ontgrendelt uitsluitend dát ene artikel.
  • Paywall-blok zonder cookie: titel "Dit artikel gratis verder lezen?" + tekst + nieuwsbriefformulier (GF #29). Mét cookie (maar ander artikel): variant "Verder lezen? Word abonnee!" met link naar /de-waarheidsvriend/aanbieding/, zonder formulier.
  • Omvang: 403 van de 8.728 WV-artikelen bevatten een marker; artikelen zonder marker zijn volledig openbaar. Titels en teksten komen per subsite uit ACF-opties ({KEY}_paywall_*). Volledige beschrijving incl. matrix: Artikel-single (WV).

2. Uitgaven-403 (digitale Waarheidsvriend)

  • /uitgaven/ (archief) en /uitgaven/⟨slug⟩/ (single, fullscreen flipbook met de uitgave-PDF) geven voor iedereen zonder rol wv-subscriber — ook anoniem, ook pastors en administrators — een HTTP 403 met de kale WordPress-foutmelding "U heeft geen toestemming om deze pagina te bekijken." (zie afwijking B12: bij de rebuild wordt dit een nette inlog-/word-abonnee-pagina).
  • Na inloggen wordt een wv-subscriber automatisch doorgestuurd naar /uitgaven/.

3. nginx-afscherming van uitgave-PDF's (alleen productie)

  • De PDF-bestanden staan in /wp-content/uploads/issues/. De productie-nginx geeft op dat pad 403 tenzij het request een wordpress_logged_in_*-cookie bevat. De check is uitsluitend op cookie-áánwezigheid: elke ingelogde gebruiker (ongeacht rol) passeert; anonieme directe URL's niet.
  • Voor de app bestaat daarnaast een beschermde drukversie-link: REST-endpoint gb-app/v1/issues/{id}/pdf-link (alleen wv-subscriber) levert een HMAC-ondertekende URL van 5 minuten geldig, waarna gb-app/v1/issues/{id}/pdf?uid&exp&sig de PDF streamt (Range/206-ondersteuning); de handtekening vervalt bij wachtwoordwijziging en bij verlies van het abonnement.

4. Predikant-403

  • /predikant-gegevens/ (profielformulier voor predikanten) geeft HTTP 403 voor iedere bezoeker zonder rol pastor — ook anoniem, ook administrators.
  • Contrast: de predikantenlijst op /over-de-gb/predikanten/ is volledig publiek (doorzoekbaar en sorteerbaar, incl. adres-/contactgegevens van 645 predikanten; e-mail/telefoon alleen als HTML-entities geobfusceerd). Predikanten kunnen zich via hun profiel afmelden voor de aanvraagbare Excel-export ("Ik wil niet verschijnen in downloadlijsten"), niet voor de lijst zelf.

5. Zachte afscherming accountpagina's

  • /account/ en /wachtwoord-wijzigen/ geven anoniem HTTP 200 met de melding "U moet ingelogd zijn om deze pagina te kunnen bekijken.." (geen formulier, geen accountnavigatie); ingelogd verschijnt het bijbehorende formulier.

6. Nieuwsbrief-edities

  • Single-URL's van newsletter-edition geven 404 voor niet-ingelogden; elke ingelogde gebruiker ziet een standalone HTML-preview (beheerfunctie).

7. REST- en app-afscherming

  • REST-routes /wp/v2/ voor wv-articles, tr-articles, cgc-articles, issues, author, faith-questions en de drie artikelcategorie-taxonomieën geven zonder authenticatie 401 "Authenticatie vereist." Elke ingelogde gebruiker (cookie of Bearer-token) passeert.
  • In de respons markeert het veld gb_locked de abonnee-status: voor niet-abonnees is content.rendered leeg, ontbreken de artikelcomponenten en ontbreekt issue_file bij uitgaven; metadata (titel, chapeau, lead, auteur, beeld) blijft.
  • App-login via gb-app/v1 (JWT-access-token 1 uur, refresh-token 90 dagen, rate-limiting 5 pogingen/15 min, generieke foutmelding "Onjuiste inloggegevens."). Wachtwoordwijziging maakt alle tokens en PDF-links ongeldig.

Inloggen, registreren, accountbeheer (samenvatting)

  • /inloggen/: loginformulier (gebruikersnaam = e-mailadres, wachtwoord, "onthoud mij"), link "Wachtwoord vergeten" naar de standaard WP-lostpassword-flow.
  • /registreren/: registratieformulier (GF #17) dat een wv-subscriber-account aanmaakt — direct actief met wachtwoord-instelmail als het e-mailadres bekend is bij de GB, anders wachtend op handmatige activatie (bevestigingstekst noemt 5–7 werkdagen).
  • /account/ (gegevens bijwerken, GF #18), /wachtwoord-wijzigen/ (GF #25), /predikant-gegevens/ (GF #24 incl. gemeenten-historie en export-opt-out).
  • Uitloggen verwijst naar /inloggen.

De volledige flows staan in de sectie Formulieren en de accountschermen in de GB-sectie.

Acceptatiecriteria

  • Als anoniem op een willekeurige pagina staat in topbar en header een "Inloggen"-link naar /inloggen/.
  • Als anoniem op /uitgaven/ en op een uitgave-detail-URL volgt HTTP 403.
  • Als anoniem op /predikant-gegevens/ volgt HTTP 403.
  • Als anoniem op /account/ en /wachtwoord-wijzigen/ volgt HTTP 200 met de melding dat inloggen vereist is, zonder formulier.
  • Als anoniem op een WV-artikel mét paywall-marker is de tekst ná de marker afwezig in de HTML-bron en verschijnt het paywall-blok "Dit artikel gratis verder lezen?" met nieuwsbriefformulier.
  • Als anoniem die het paywall-formulier inzendt, is daarna precies dát artikel volledig leesbaar; een ánder paywall-artikel toont "Verder lezen? Word abonnee!" zonder formulier.
  • Als anoniem op een WV-artikel zónder paywall-marker is de volledige tekst zichtbaar.
  • Als anoniem op /over-de-gb/predikanten/ is de predikantenlijst volledig zichtbaar, doorzoekbaar (?search=) en sorteerbaar (?sort=).
  • Als anoniem op de afgeschermde REST-routes volgt 401; op een nieuwsbrief-editie-URL volgt 404.
  • Als ingelogde subscriber (zonder WV-abonnement) toont de accountdropdown alleen "Wachtwoord wijzigen" en "Uitloggen"; /uitgaven/* geeft 403 en paywall-artikelen blijven afgekapt.
  • Als wv-subscriber word ik na inloggen doorgestuurd naar /uitgaven/; het archief toont uitgaven met cover en paginering en een uitgave opent als fullscreen bladerbare PDF.
  • Als wv-subscriber zijn alle paywall-artikelen volledig leesbaar en is de admin bar verborgen.
  • Als wv-subscriber levert GET /gb-app/v1/issues/{id}/pdf-link een URL die maximaal 5 minuten geldig is en de PDF inline streamt; na wachtwoordwijziging is die link ongeldig.
  • Als pastor toont de accountdropdown "Mijn account", "Predikant gegevens", "Wachtwoord wijzigen" en "Uitloggen" (geen "Waarheidsvriend digitaal"); /predikant-gegevens/ toont het profielformulier; /uitgaven/* geeft 403.
  • Als pastor die het profiel opslaat, zijn de wijzigingen daarna zichtbaar op de publieke predikantenlijst; met opt-out aangevinkt ontbreekt de predikant in de Excel-export.
  • Als beheerder (administrator/*-admin) is de admin bar zichtbaar en is er géén toegang tot /uitgaven/* of /predikant-gegevens/ zonder de betreffende rol.
  • Als anoniem op een directe PDF-URL onder /wp-content/uploads/issues/ volgt (op productie) HTTP 403; met login-cookie wordt de PDF geleverd.
  • Als gebruiker die de rol wv-subscriber verliest (importrun), geldt per direct het niet-abonneegedrag.

Bekende afwijkingen

Zie de verzamelpagina, met name: kale WP-403-pagina's op uitgaven en predikant-gegevens (B12), ontbrekende "Mijn account"-link voor de rol subscriber (B13), de publiek bereikbare Waarheidsvriend-PDF via een flipbook-URL buiten de afscherming om (D2) en het open GraphQL-endpoint (E1).