
Privacy in Joomla
Vroeg of laat krijgt elke website-eigenaar dezelfde e-mail: "Stuur me alle persoonsgegevens die jullie over mij bewaren, en verwijder ze daarna." Een paar jaar geleden zou zo'n bericht voor paniek. Maar lost Joomla dat op met een functie die sinds 2018 standaard wordt meegeleverd.
De Privacy Suite (de component com_privacy, plus een kleine familie plugins) verandert privacywetgeving van een chaos in een werkproces. Je kunt er alles wat Joomla over een persoon weet mee exporteren, verwijderen of anonimiseren, vastleggen dat bezoekers akkoord gingen met je privacybeleid, en precies tonen welke onderdelen van je site persoonsgegevens verwerken.
Joomla levert de AVG-gereedschappen standaard mee, zodat je gegevensverzoeken afhandelt met een knop in plaats van een spreadsheet.
Dit artikel legt uit hoe de Privacy Suite werkt, van de basis voor eigenaren en redacteuren, via de dagelijkse afhandeling voor beheerders, tot de plugin-events waarmee ontwikkelaars hun eigen extensies privacybewust maken. Het doel is simpel: je helpen om met vertrouwen een verzoek van een betrokkene af te handelen op de dag dat er een in je inbox belandt.
1. De basis
1.1 Wat is de Joomla Privacy Suite?
De Privacy Suite is Joomla's ingebouwde gereedschapskist voor privacywetgeving zoals de Europese AVG (GDPR). Joomla introduceerde het in versie 3.9 (mei 2018) en het wordt sindsdien standaard meegeleverd. Het is niet één scherm, maar een kleine set samenwerkende onderdelen:
- Een component,
com_privacy, met een dashboard, verzoeken, toestemmingen en mogelijkheden. - Een groep
privacy-plugins die weten hoe ze gegevens exporteren en verwijderen, elk voor één gebied. - Een Privacy Consent-systeemplugin die ingelogde gebruikers vraagt akkoord te gaan met je privacybeleid.
- Een Algemene voorwaarden-gebruikersplugin voor het registratieformulier.
Je hoeft niets te installeren. Alles wat hier beschreven wordt zit al in je Joomla. Je hoeft alleen de onderdelen die je wilt in te schakelen en te configureren.
1.2 Wat "persoonsgegevens" hier betekent
Onder de AVG zijn persoonsgegevens alle informatie waarmee een levend persoon geïdentificeerd kan worden. Op een typische Joomla-site hoort daarbij:
- De naam, gebruikersnaam en e-mail in
#__users. - Gegevens uit contactformulieren en de contactcomponent.
- Privéberichten tussen gebruikers.
- IP-adressen die in de actielog staan.
- Het record dat een persoon akkoord ging met je privacybeleid.
De Privacy Suite is opgebouwd rond twee rechten die de wet aan iedereen geeft: het recht op inzage (geef mij mijn gegevens) en het recht op verwijdering (wis mijn gegevens). Joomla noemt deze een exportverzoek en een verwijderingsverzoek.
1.3 Waar vind ik het?
In de Joomla 6-backend staat de Privacy Suite onder het menu Gebruikers:
Gebruikers → Privacy de Privacy-kop opent het dashboard
Gebruikers → Privacy → Verzoeken export- en verwijderingsverzoeken
Gebruikers → Privacy → Mogelijkheden welke gegevens elk onderdeel verwerkt
Gebruikers → Privacy → Toestemmingen wie akkoord ging met het privacybeleid
Systeem → Beheren → Plugins de privacy- en toestemmingsplugins
De component zelf staat in administrator/components/com_privacy/. Twee kleine naamkwesties zijn vooraf goed om te weten. Ten eerste staat het onder Gebruikers, niet onder Systeem, wat mensen verrast die een privacytool onder de systeeminstellingen verwachten. Ten tweede is er geen aparte "Dashboard"-link: de Privacy-kop in het menu is het dashboard. Het scherm Verzoeken heet bovenaan de pagina ook Privacy: Informatieverzoeken, terwijl de menulink simpelweg Verzoeken is.
1.4 Wat de Privacy Suite niet doet
Eén punt voorkomt de meeste verwarring voordat die ontstaat: de Privacy Suite is een raamwerk voor informatieverzoeken en toestemmingsrecords, geen magische compliance-knop. Het verzorgt met name niet:
- Cookiebanners of cookietoestemming.
- Toestemming voor analytics en tracking, zoals het blokkeren van Google Analytics of Matomo totdat een bezoeker akkoord gaat.
- Marketing-opt-ins voor nieuwsbrieven of advertenties.
- Scripts van derden die laden voordat een gebruiker akkoord is gegaan.
Die hebben aparte configuratie of een speciale cookietoestemmings-extensie nodig. Alleen com_privacy installeren maakt een site op zichzelf niet AVG-conform. Het geeft je een gestructureerde manier om verzoeken van betrokkenen te beantwoorden en toestemming vast te leggen, wat één belangrijk onderdeel van compliance is, niet het geheel.
2. Het privacydashboard
2.1 Je startpunt
Klik op de kop Gebruikers → Privacy. Het dashboard is de regelkamer voor de hele suite. Het toont in één oogopslag:
- Hoeveel verzoeken in behandeling zijn en op actie wachten.
- Hoeveel verzoeken urgent zijn, oftewel dicht bij de wettelijke deadline.
- Een herinnering om een echt privacybeleid te publiceren en te koppelen.
- Snelkoppelingen om een verzoek aan te maken of de opties te openen.
2.2 De urgentiedrempel
De AVG geeft je één maand om een verzoek van een betrokkene te beantwoorden. Om verrassingen te voorkomen markeert Joomla een verzoek als urgent vóór die deadline. Je stelt de drempel in onder Gebruikers → Privacy → Verzoeken → Opties, in het veld Aantal dagen voordat een verzoek urgent is. De standaard is 14 dagen, en Joomla begrenst het veld onder de 30, zodat de instelling altijd binnen de wettelijke termijn van één maand blijft.
Het dashboard maakt van dat getal een zichtbare teller. Staat de urgente teller boven nul, dan vraagt er vandaag iets om je aandacht.
Naar boven3. Informatieverzoeken: export en verwijdering
3.1 De twee soorten verzoeken
Alles wat de suite voor een individu doet, verloopt via een verzoek. Er zijn precies twee soorten:
| Type | Recht dat het dient | Resultaat |
|---|---|---|
| Export | Recht op inzage | Een XML-bestand met alle gegevens van de persoon. |
| Verwijdering | Recht op verwijdering | De gegevens van de persoon verwijderd of geanonimiseerd. |
Een verzoek is gekoppeld aan één e-mailadres, niet aan een gebruikers-id. Dat is bewust: de aanvrager kan een gast zijn die een contactformulier invulde, geen geregistreerde gebruiker.
3.2 Een verzoek aanmaken als beheerder
Zo handel je een verzoek af dat per e-mail of post binnenkwam:
- Ga naar
Gebruikers → Privacy → Verzoekenen klik op Nieuw. - Voer het e-mailadres van de persoon in.
- Kies Export of Verwijdering.
- Sla op. Joomla mailt een bevestigingslink naar dat adres.
De bevestigingsstap is belangrijk. Door een token naar het e-mailadres te sturen, zorgt Joomla ervoor dat de persoon die de mailbox beheert de actie ook echt wil. Dit voorkomt dat de ene gebruiker het account van een ander verwijdert door een e-mailadres te raden.
3.3 Gebruikers hun eigen verzoek laten indienen
Je kunt mensen het proces ook zelf laten starten, zonder beheerder ertussen. De Privacy-component levert front-end menu-itemtypes precies hiervoor:
- Verzoek aanmaken: een openbaar formulier waar een bezoeker zijn e-mail invoert en export of verwijdering kiest.
- Verzoek bevestigen: de landingspagina waarnaar de bevestigingsmail linkt.
- Toestemming verlengen: een pagina waar een ingelogde gebruiker zijn privacytoestemming vernieuwt.
Maak van elk type een menu-item, link ernaar vanaf je privacybeleidpagina, en de hele bevestigingsstap loopt vanzelf. Je verwerkt het bevestigde verzoek nog steeds met de hand, zodat een mens de controle houdt over elke verwijdering.
3.4 De bevestigingsmail en e-mailsjablonen
Het hele verzoekproces hangt af van één e-mail die de persoon bereikt. Joomla verstuurt die via het centrale systeem van e-mailsjablonen, zodat je de tekst kunt nakijken en vertalen onder Systeem → Sjablonen → E-mailsjablonen. Zoek het sjabloon voor de bevestiging van het privacyverzoek en pas de tekst aan zodat die duidelijk en niet-technisch klinkt.
Omdat die e-mail de poortwachter is, zorg dat die ook echt aankomt:
- Gebruik een echte SMTP-dienst in plaats van PHP
mail()voor betrouwbare bezorging. - Stel SPF, DKIM en DMARC in zodat het bericht niet als spam wordt gefilterd.
- Stuur een test voordat je een openbaar verzoekformulier opent.
Werkt de mail niet, dan stapelen verzoeken zich op bij Bevestiging in behandeling en wordt de hele suite stilletjes nutteloos.
Naar boven4. De levenscyclus en statussen van een verzoek
4.1 De weg die een verzoek aflegt
Elk verzoek doorloopt een kleine set statussen. Die goed lezen is de kernvaardigheid bij privacywerk:
Bevestiging in behandeling token gemaild, wacht tot de persoon klikt
↓
Bevestigd (in behandeling) persoon klikte op de link, klaar om te verwerken
↓
Voltooid je hebt de gegevens geëxporteerd of verwijderd
↓
Ongeldig verzoek afgewezen of niet afgemaakt
Een nieuw verzoek begint bij Bevestiging in behandeling. Als de persoon op de link in de e-mail klikt, wordt het Bevestigd en verschijnt het in je werkwachtrij. Nadat je de export of verwijdering hebt uitgevoerd, markeer je het als Voltooid. Is een verzoek nep, verlopen of dubbel, dan zet je het op Ongeldig.
4.2 Een bevestigd verzoek verwerken
Open een bevestigd verzoek en je ziet twee actieknoppen in de werkbalk, afgestemd op het type verzoek:
- Bij een export verzamelt Gegevens exporteren alles en maakt een XML-document met de gegevens van de persoon.
- Bij een verwijdering vraagt Gegevens verwijderen elke privacyplugin om zijn deel te verwijderen of te anonimiseren.
Voordat een verwijdering loopt, vraagt Joomla aan elke plugin of de gegevens verwijderd mogen worden. Een plugin kan de verwijdering blokkeren, bijvoorbeeld als de gebruiker een Super User is of nog gepubliceerde inhoud bezit. Deze veiligheidscheck voorkomt dat een zelfbedieningsformulier een beheerdersaccount wist.
4.3 Waarom je het verzoek bewaart
Nadat je een verzoek hebt voltooid, blijft de verzoekregel zelf in de lijst staan als bewijs dat je iets deed, en wanneer. Die auditwaarde is de reden dat de verzoeklog niet automatisch wordt gewist. Behandel de lijst Verzoeken als je bewijs dat je aan je wettelijke plicht voldeed.
4.4 Wie verzoeken mag verwerken
Een verzoek verwerken kan de gegevens van een persoon exporteren of wissen, dus het is een gevoelige bevoegdheid. Behandel die zo. Onder de Rechten van de component (op het scherm Opties) geef je alleen toegang aan vertrouwde beheerders, en houd je het aantal mensen dat een export of verwijdering kan uitvoeren klein.
Een verstandig patroon volgt de aanpak van de actielog: een aparte rol voor gegevensbescherming die verzoeken kan bekijken en verwerken, terwijl gewone redacteuren helemaal geen toegang tot de Privacy-schermen hebben. Hoe minder handen die persoonsgegevens aanraken, hoe makkelijker je zorgplicht te verdedigen is.
Naar boven5. Toestemmingen: akkoord vastleggen
5.1 Wat een toestemmingsrecord is
De wet vraagt je vaak te bewijzen dat een persoon ergens mee akkoord ging, en wanneer. Het overzicht Gebruikers → Privacy → Toestemmingen is dat bewijs. Elke regel legt vast dat een specifieke gebruiker op een specifiek moment akkoord ging met een specifiek document (je privacybeleid).
Een toestemmingsrecord bewaart de gebruiker, het onderwerp en de inhoud van waar hij mee akkoord ging, de datum en een status (geldig of ingetrokken). Omdat de suite de werkelijke tekst die de gebruiker zag opslaat, kun je later precies tonen waarmee hij akkoord ging, ook als je het beleid daarna wijzigt.
5.2 Waar toestemmingen vandaan komen
Toestemmingsregels worden geschreven door de Privacy Consent-plugin (sectie 6) wanneer een ingelogde gebruiker het akkoordvakje aanvinkt. Ze worden niet met de hand aangemaakt. Het overzicht Toestemmingen is in de geest alleen-lezen: je bekijkt en, indien nodig, verklaart een toestemming ongeldig, maar je typt er geen in.
Dit is dezelfde filosofie als bij de actielog: een record dat je vrij kunt bewerken is geen betrouwbaar bewijs, dus Joomla beperkt wat je kunt wijzigen.
Naar boven6. De Privacy Consent-plugin
6.1 Wat het doet
De plugin System - Privacy Consent (plg_system_privacyconsent) zorgt dat je geregistreerde gebruikers actief akkoord zijn gegaan met je privacybeleid. Als die ingeschakeld is, wordt een ingelogde gebruiker die nog niet akkoord ging doorgestuurd naar een toestemmingsformulier en kan hij de site niet normaal gebruiken tot hij akkoord gaat.
Je vindt het onder Systeem → Beheren → Plugins → System - Privacy Consent. Het is standaard uitgeschakeld, omdat toestemming afdwingen pas zin heeft als je een echt privacybeleid hebt om naar te verwijzen.
6.2 De belangrijkste instellingen
| Instelling | Wat het doet |
|---|---|
| Privacytype | Koppel een artikel of een menu-item als beleid. |
| Privacy-artikel / menu-item | Welk artikel of menu-item de beleidstekst bevat. |
| Privacy-opmerking | De korte tekst naast het akkoordvakje. |
| Verloop van toestemming | Of een toestemming na een aantal dagen verloopt. |
| Verloop van toestemming in dagen | Hoe lang een toestemming geldig blijft voordat om vernieuwing wordt gevraagd. |
6.3 Toestemming laten verlopen en vernieuwen
Als je verloop inschakelt, beschouwt Joomla een toestemming na het ingestelde aantal dagen als verouderd en vraagt het de gebruiker bij zijn volgende bezoek opnieuw akkoord te gaan. Dit is handig als je je beleid bijwerkt en van iedereen een vers, gedateerd akkoord wilt. Combineer het met het front-end menu-item Toestemming verlengen, zodat gebruikers een duidelijke pagina hebben om te vernieuwen.
Laat verloop uit als je beleid zelden verandert. Een eindeloze stroom "ga opnieuw akkoord"-meldingen irriteert gebruikers en voegt weinig juridische waarde toe als er niets is veranderd.
6.4 Meertalige privacytekst
Op een meertalige site moet toestemming geïnformeerd zijn, wat betekent dat elke bezoeker het beleid in zijn eigen taal moet lezen. Een paar praktische punten:
- Publiceer het privacybeleid-artikel in elke sitetaal en koppel de vertalingen, zodat een Nederlandse bezoeker het Nederlandse beleid ziet.
- Vertaal de toestemmingsopmerking naast het vakje, met een taaloverschrijving als de standaardtekst niet volstaat.
- Onthoud dat een geëxporteerd toestemmingsrecord de tekst weergeeft waar de gebruiker daadwerkelijk mee akkoord ging, in de taal die hij toen zag.
Wijs de plugin via het menu-item waarnaar het linkt naar het vertaalde beleid, en de juiste taal volgt de bezoeker automatisch.
Naar boven7. Algemene voorwaarden versus privacytoestemming
7.1 Twee plugins, twee momenten
Mensen verwarren de twee toestemmingsplugins vaak omdat beide een vakje voor de gebruiker zetten. Het verschil zit in wanneer ze in actie komen:
| Plugin | Komt in actie | Typisch gebruik |
|---|---|---|
User - Terms and Conditions (plg_user_terms) |
Bij registratie | Algemene voorwaarden accepteren voordat een account bestaat. |
System - Privacy Consent (plg_system_privacyconsent) |
Bij registratie, en na inloggen voor bestaande gebruikers | Akkoord gaan met het privacybeleid, met optioneel verloop. |
De overlap is de Privacy Consent-plugin: die voegt zijn vakje toe aan het registratie- en profielformulier van de gebruiker, en stuurt ook een al ingelogde gebruiker die nooit akkoord ging door naar een toestemmingspagina. Zo kan die zowel bij aanmelding als bij een later bezoek in actie komen. De plugin Algemene voorwaarden komt daarentegen alleen op het registratieformulier in actie.
7.2 Welke je gebruikt
Gebruik Algemene voorwaarden als je wilt dat elk nieuw account je siteregels accepteert op het moment van aanmelden. Gebruik Privacy Consent als je ook wilt dat bestaande gebruikers, die zich registreerden lang voordat je een beleid schreef, een vastgelegd, gedateerd akkoord geven. Veel sites gebruiken beide: voorwaarden bij de deur, privacytoestemming bij binnenkomst.
Alleen de Privacy Consent-plugin schrijft regels in de toestemmingstabel die de Privacy Suite later kan exporteren en auditen. De voorwaardenplugin blokkeert simpelweg de registratie tot het vakje is aangevinkt.
Naar boven8. Mogelijkheden: een kaart van je gegevens
8.1 Het zelfdocumenterende overzicht
Het overzicht Gebruikers → Privacy → Mogelijkheden beantwoordt een vraag die elke privacy-audit stelt: "Welke persoonsgegevens verwerkt dit systeem, en waar?" In plaats van te gokken open je één scherm en Joomla somt het voor je op.
Elke ingeschakelde privacyplugin levert een korte beschrijving van de gegevens die het verwerkt. De standaardplugins melden zaken als:
- Velden van gebruikersaccounts (naam, gebruikersnaam, e-mail, registratiedatum).
- Contactrecords gekoppeld aan een gebruiker.
- Privéberichten.
- Vastgelegde privacytoestemmingen.
- IP-adressen en handelingen in de actielog.
8.2 Waarom het belangrijk is
Het overzicht Mogelijkheden wordt opgebouwd door een event (sectie 10), dus het groeit automatisch mee als je privacybewuste extensies toevoegt. Een goed geschreven extensie van derden die persoonsgegevens opslaat, hoort hier zijn eigen regel toe te voegen. Doet die dat, dan is je "verwerkingsregister", een document dat de AVG van je verwacht, voor de helft al geschreven.
Naar boven9. Onder de motorkap (ontwikkelaarsperspectief)
9.1 De databasetabellen
De Privacy Suite bewaart zijn status in twee hoofdtabellen:
#__privacy_requests een regel per export- of verwijderingsverzoek
#__privacy_consents een regel per vastgelegde toestemming
De kernvelden van #__privacy_requests zijn:
id automatisch oplopende primaire sleutel
email het e-mailadres van de betrokkene
requested_at wanneer het verzoek is aangemaakt
status bevestiging in behandeling / bevestigd / voltooid / ongeldig
request_type 'export' of 'remove'
confirm_token gehasht token uit de bevestigingsmail
confirm_token_created_at wanneer het token is uitgegeven (voor verloop)
De kernvelden van #__privacy_consents zijn:
id automatisch oplopende primaire sleutel
user_id de gebruiker die akkoord ging
state 1 = geldig, 0 = ingetrokken
created wanneer toestemming is gegeven
subject de titel van waar men mee akkoord ging
body een momentopname van de afgesproken tekst
9.2 De plugingroep
Het echte werk wordt gedaan door plugins in de privacy-groep, die elk Joomla's basisklasse PrivacyPlugin uitbreiden. De component raakt nooit rechtstreeks de gebruikers-, contact- of berichttabellen aan. In plaats daarvan vuurt het events af en laat het elke plugin zijn eigen gegevens afhandelen. Dit is hetzelfde losgekoppelde patroon dat Joomla overal in het CMS gebruikt: de component dirigeert, de plugins doen het domeinwerk.
9.3 De vier events
Een privacyplugin kan zich op vier events abonneren:
| Event | Doel |
|---|---|
onPrivacyCollectAdminCapabilities |
Regels toevoegen aan het overzicht Mogelijkheden. |
onPrivacyExportRequest |
De gegevens van deze plugin teruggeven voor een export, als domains. |
onPrivacyCanRemoveData |
Een verwijdering tegenhouden, bijv. een Super User beschermen. |
onPrivacyRemoveData |
De gegevens van deze plugin verwijderen of anonimiseren. |
9.4 Hoe een export wordt opgebouwd
Een export is niet één grote query. Elke plugin geeft een of meer domains terug, en elk domain bevat items opgebouwd uit velden met naam-waardeparen. De component verzamelt de domains van alle plugins en serialiseert het geheel naar XML. Een vereenvoudigde export-handler ziet er zo uit:
public function onPrivacyExportRequest(PrivacyExportRequestEvent $event)
{
$request = $event->getRequest();
$user = $event->getUser();
$domain = $this->createDomain('user_profile', 'Joomla user account');
$item = $this->createItemForUserId($user->id, $tableData);
$domain->addItem($item);
return [$domain];
}
Omdat elke plugin dezelfde domain-item-veldvorm spreekt, is het exportbestand consistent, hoeveel extensies er ook aan bijdragen.
Naar boven10. De privacyplugins, een voor een
10.1 De standaardset
Joomla levert vijf privacyplugins mee, elk voor één gebied van persoonsgegevens. Je vindt ze onder Systeem → Beheren → Plugins, gefilterd op type privacy:
| Plugin | Dekt |
|---|---|
plg_privacy_user |
Kerngegevens van gebruikersaccounts in #__users. |
plg_privacy_contact |
Contacten in com_contact gekoppeld aan een gebruiker. |
plg_privacy_message |
Privéberichten tussen gebruikers. |
plg_privacy_consents |
De toestemmingsrecords zelf. |
plg_privacy_actionlogs |
Regels in de actielog, inclusief IP-adressen. |
10.2 Schakel in wat van toepassing is
Elke plugin voegt alleen gegevens aan een export toe, of verwijdert gegevens, zolang die is ingeschakeld. Schakel je de berichtenplugin uit, dan verschijnen de privéberichten van een gebruiker niet in zijn export en worden ze niet geraakt door een verwijdering. Houd elke privacyplugin ingeschakeld waarvan je de gegevens echt opslaat. Eén uitschakelen creëert stilletjes een gat in je antwoorden aan betrokkenen, precies het soort gat waar een auditor naar zoekt.
10.3 Het verwijderingsveto in de praktijk
De gebruikersplugin gebruikt onPrivacyCanRemoveData om het verwijderen van een Super User-account te weigeren. Dat is een verstandige beveiliging: je wilt niet dat een openbaar verwijderingsformulier een manier wordt om een beheerder te wissen. Als een verwijdering wordt geblokkeerd, toont Joomla de reden en laat het verzoek open zodat een mens kan beslissen wat te doen.
11. Je eigen extensie privacybewust maken
11.1 Waarom zou je
Als je component persoonsgegevens opslaat, bijvoorbeeld een boekingssysteem met namen en telefoonnummers, hoort die mee te doen met de Privacy Suite. Anders is een export onvolledig en laat een verwijdering persoonsgegevens achter, en beide breken de belofte die je in je privacybeleid deed.
11.2 De drie stappen
Schrijf één plugin in de privacy-groep die zich abonneert op de events die je nodig hebt:
- Implementeer
onPrivacyCollectAdminCapabilitieszodat je gegevens in het overzicht Mogelijkheden verschijnen. - Implementeer
onPrivacyExportRequestom je gegevens als domains en items terug te geven. - Implementeer
onPrivacyRemoveData(en optioneelonPrivacyCanRemoveData) om ze te wissen of te anonimiseren.
Een minimale capabilities-handler is genoeg om je extensie zichtbaar te maken voor een auditor:
public function onPrivacyCollectAdminCapabilities()
{
$this->loadLanguage();
return [
Text::_('PLG_PRIVACY_BOOKINGS') => [
Text::_('PLG_PRIVACY_BOOKINGS_CAPABILITY_NAME'),
Text::_('PLG_PRIVACY_BOOKINGS_CAPABILITY_PHONE'),
],
];
}
11.3 Anonimiseren in plaats van verwijderen
Bij een verwijdering is een regel wissen niet altijd juist. Verwijder je een boeking helemaal, dan breek je misschien een factuur die wettelijk bewaard moet blijven. Het gangbare patroon is anonimiseren: vervang de naam, e-mail en telefoon door neutrale plaatshouders en houd de structuur van het record intact.
UPDATE #__bookings
SET customer_name = 'Removed',
customer_email = CONCAT('removed-', id, Dit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. '),
customer_phone = ''
WHERE customer_email = :email;
Wat je ook kiest, bind de e-mail altijd als parameter in plaats van die in de SQL te plakken. Joomla's query builder maakt dit makkelijk met ->bind(':email', $request->email). De querystring met de hand opbouwen opent een SQL-injectiegat in precies de gegevens die je probeert te beschermen.
Anonimiseren voldoet aan het recht op verwijdering van persoonsgegevens en behoudt tegelijk het niet-persoonlijke boekhoudspoor. Kies alleen verwijderen als geen enkele andere verplichting je dwingt de regel te bewaren.
11.4 Wanneer je een verwijdering blokkeert
Soms is het juiste antwoord op een verwijdering "nog niet". Je onPrivacyCanRemoveData-handler is de plek waar je dat zegt, met een duidelijke reden die de beheerder kan lezen. Veelvoorkomende, verdedigbare blokkades zijn:
- Een onbetaalde factuur of een openstaande bestelling.
- Een actief abonnement of lidmaatschap.
- Een wettelijke bewaartermijn, zoals belastinggegevens die je jaren moet bewaren.
- Een lopend geschil, terugboeking of fraudeonderzoek.
Blokkeren is geen weigering van de rechten van de persoon; het is een gedocumenteerde pauze zolang een sterkere wettelijke verplichting geldt. Leg vast waarom, en verwijder de gegevens zodra de verplichting eindigt.
11.5 Houd exports schoon en veilig
Een export wordt gelezen door de persoon, en soms door een toezichthouder, dus ontwerp die voor hen, niet voor je database. Twee regels zijn het belangrijkst:
- Maak het leesbaar. Geef betekenisvolle domains en items terug ("Profiel", "Boekingen", "Nieuwsbriefstatus"), geen ruwe tabeldumps of geserialiseerde blobs.
- Lek nooit meer dan de persoon. Een export mag alleen de gegevens van dat individu bevatten. Houd records van andere gebruikers, interne tokens, API-sleutels, wachtwoordhashes en configuratiegeheimen eruit.
Te veel delen in een export is zelf een datalek. Bij twijfel: neem minder op en label het duidelijk.
Naar boven12. Webservices en automatisering
12.1 Geen publiek REST-endpoint
Anders dan inhoud of gebruikers stelt de Privacy-component standaard geen Web Services API-endpoint beschikbaar. Er is geen route /api/index.php/v1/privacy om verzoeken via REST aan te maken of te verwerken. Dit is een bewuste, behoudende keuze: de gegevens van een persoon verwijderen is een gevoelige, door mensen gecontroleerde actie, niet iets dat je automatisch door een token wilt laten activeren.
Je ziet hier dus geen curl-voorbeeld zoals andere artikelen dat tonen. Heb je automatisering nodig, dan bouw je die zelf met de modellen van de component in een plugin of CLI-script, waar jij de veiligheidschecks beheert.
12.2 Bevestigingstokens verlopen
Het bevestigingstoken bij elk verzoek heeft een beperkte levensduur. Negeert iemand de e-mail te lang, dan verloopt het token en kan het verzoek niet meer worden bevestigd. Je maakt dan een nieuw verzoek aan. Dit voorkomt dat verlopen, half afgemaakte verzoeken zich opstapelen en zorgt dat een oude bevestigingslink niet veel later nog gebruikt kan worden.
12.3 Oude verzoeken opruimen
De lijst Verzoeken is je auditbewijs, dus Joomla ruimt die niet automatisch op. Zegt je bewaarbeleid dat je voltooide verzoeken na een periode mag verwijderen, gebruik dan de Scheduler-component (Systeem → Beheren → Taken) met een SQL-opschoontaak, dezelfde aanpak als bij het inkorten van de actielog. Bewaar minstens een samenvatting van wie wat vroeg, en wanneer je antwoordde.
13. IP-adressen, logs en andere persoonsgegevens
13.1 De link met de actielog
De makkelijkst vergeten opslag van persoonsgegevens is de actielog, want een IP-adres telt onder de AVG als persoonsgegeven. De plugin plg_privacy_actionlogs verbindt de twee systemen: exporteer je de gegevens van een persoon, dan worden zijn actielog-regels meegenomen, en een verwijdering kan ze schoonvegen.
Zet je IP-logging in de actielog aan, schrijf dat dan in je privacybeleid en stel een bewaartermijn in. Een IP voor altijd bewaren is moeilijk te rechtvaardigen; een venster van 90 dagen voor beveiliging is makkelijk te verdedigen.
13.2 Gegevens die de suite niet ziet
De Privacy Suite kent alleen gegevens die een privacyplugin meldt. Het kan niet bij:
- Persoonsgegevens binnen een extensie van derden zonder privacyplugin.
- Gegevens in externe systemen, zoals een nieuwsbriefplatform of een betaalprovider.
- Back-ups en databasedumps die buiten Joomla worden bewaard.
Als je een verwijderingsverzoek beantwoordt, denk dan aan de gegevens buiten Joomla's bereik. Een volledige wissing betekent vaak een paar handmatige stappen naast de knop in com_privacy.
13.3 Ontdekken waar persoonsgegevens zich verstoppen
Voordat je erop vertrouwt dat een export volledig is, ontdek waar persoonsgegevens echt staan. Een snelle auditquery somt elke kolom op die op een e-mailadres lijkt in de hele database:
SELECT TABLE_NAME, COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND COLUMN_NAME LIKE '%email%'
ORDER BY TABLE_NAME, COLUMN_NAME;
Herhaal het voor %phone%, %ip% en %name%. Elke tabel die opduikt maar geen bijbehorende privacyplugin heeft, is een blinde vlek in je export en verwijdering. Deze query vervangt geen echte privacyplugins; hij vertelt je welke je nog moet schrijven of installeren.
14. SEO en metadata
14.1 De privacybeleidpagina zelf
De Privacy Suite leunt op één gewone pagina: je privacybeleid. Behandel het als een echt, goed gebouwd artikel, geen bijzaak.
- Geef het een duidelijke, beschrijvende titel zoals "Privacybeleid" zodat zoekmachines en gebruikers het meteen herkennen.
- Schrijf een korte, eerlijke metabeschrijving die zegt welke gegevens je verzamelt en waarom.
- Houd de URL stabiel. De Privacy Consent-plugin en je footer linken er allebei naar, en een veranderende URL breekt die links.
14.2 Indexering en zichtbaarheid
Een privacybeleid hoort openbaar en indexeerbaar te zijn. Verberg het niet achter een login en markeer het niet als noindex. Toezichthouders, browsers en gebruikers verwachten het allemaal in één klik te bereiken, meestal via een footerlink op elke pagina.
Een subtiel punt: de toestemmings- en verzoekpagina's zijn daarentegen gebruikersacties, geen inhoud. Ze hebben weinig SEO-waarde, en het verzoekformulier hoort niet geïndexeerd te worden alsof het een artikel is. Link ernaar vanuit je beleidstekst, niet vanuit je hoofdnavigatie.
Naar boven15. Veelgemaakte fouten en valkuilen
15.1 "De bevestigingsmail komt nooit aan"
Symptoom: een verzoek blijft eeuwig op Bevestiging in behandeling staan, en de gebruiker zegt dat hij niets kreeg.
Oplossing: de suite gebruikt Joomla's mailer. Controleer Systeem → Globale configuratie → Server → E-mail en stuur een test. Op een lokale stack bevestigt een onderschepper als MailHog of Joomla het bericht wel echt verstuurde. Geen werkende mail betekent geen privacyproces.
15.2 "Ik schakelde Privacy Consent in en sloot iedereen buiten"
Symptoom: elke ingelogde gebruiker wordt naar een toestemmingsformulier gestuurd, jij ook.
Oplossing: dit is verwacht gedrag, maar het heeft een echt beleid nodig om naar te wijzen. Publiceer het privacy-artikel voordat je de plugin inschakelt en selecteer het in de instelling Privacy-artikel van de plugin. Dan heeft het toestemmingsformulier iets te tonen.
15.3 "De export mist gegevens"
Symptoom: een export bevat geen berichten, contacten of de gegevens van een extensie van derden.
Oplossing: een privacyplugin draagt alleen bij zolang die is ingeschakeld. Controleer dat elke relevante privacy-plugin aanstaat, en onthoud dat extensies zonder privacyplugin onzichtbaar zijn voor de export.
15.4 "Een verwijdering deed niets"
Symptoom: je klikt op Gegevens verwijderen en het account blijft bestaan.
Oplossing: een plugin hield het tegen. De gebruikersplugin weigert een Super User te verwijderen. Verlaag de groep van het account of draag eerst de inhoud over en probeer opnieuw, of handel dat account met de hand af.
15.5 "We verwijderden de gebruiker, maar de gegevens kwamen terug in een back-up"
Symptoom: een verwijderde persoon duikt na een herstel weer op.
Oplossing: wissing moet back-ups in je bewaarbeleid meenemen. Oude back-ups kun je meestal niet bewerken, dus documenteer dat persoonsgegevens een vastgestelde periode in back-ups blijven en bij de rotatie worden overschreven.
15.6 "Privacy staat niet in mijn menu"
Symptoom: je kunt de Privacy-schermen niet vinden.
Oplossing: ze staan onder Gebruikers, niet onder Systeem, en de ACL verbergt ze voor iedereen zonder toegang tot de component. Controleer de groepsrechten van het account.
Naar boven16. Best practices
Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:
- Publiceer eerst een duidelijk privacybeleid; elk ander onderdeel van de suite linkt ernaar.
- Houd alle vijf de standaard privacyplugins ingeschakeld zodat exports en verwijderingen volledig blijven.
- Houd de urgente teller op het dashboard in de gaten; beantwoord verzoeken ruim binnen de termijn van één maand.
- Bevestig elk verzoek per e-mail voordat je handelt, ook die je zelf aanmaakt.
- Anonimiseer in plaats van verwijderen als een boekhoud- of wettelijk record moet blijven bestaan.
- Denk aan de gegevens die Joomla niet ziet: tools van derden, externe diensten en back-ups.
- Sla je persoonsgegevens op in een eigen extensie, lever er dan een privacyplugin bij.
- Beperk wie verzoeken kan verwerken en wissen tot een kleine, vertrouwde groep.
- Onthoud dat de suite geen cookietoestemming dekt; voeg een aparte cookie-oplossing toe als je die nodig hebt.
17. In het kort
DASHBOARD Gebruikers → Privacy (de kop zelf)
VERZOEKEN Gebruikers → Privacy → Verzoeken
TOESTEMMING Gebruikers → Privacy → Toestemmingen
MOGELIJKHEDEN Gebruikers → Privacy → Mogelijkheden
OPTIES Gebruikers → Privacy → Verzoeken → Opties
URGENTE DAGEN Opties → Aantal dagen voordat verzoek urgent is (standaard 14)
CONSENT-PLUG Systeem → Plugins → System - Privacy Consent
VOORWAARDEN Systeem → Plugins → User - Terms and Conditions
PLUGINGROEP privacy (user, contact, message, consents, actionlogs)
TABELLEN #__privacy_requests, #__privacy_consents
VERZOEKTYPE export | remove
STATUSSEN bevestiging in behandeling → bevestigd → voltooid | ongeldig
EXPORTFORMAAT XML, opgebouwd uit plugin-domains en items
EVENTS onPrivacyCollectAdminCapabilities, onPrivacyExportRequest,
onPrivacyCanRemoveData, onPrivacyRemoveData
REST-API geen in core (bewust)
E-MAILSJABL. Systeem → Sjablonen → E-mailsjablonen
NIET GEDEKT cookietoestemming, analytics/marketing-opt-ins
SINDS Joomla 3.9 (mei 2018)
Naar boven18. Samenvatting
De Joomla Privacy Suite verandert een juridische hoofdpijn in routine. Het wordt standaard meegeleverd, vraagt niets extra's, en geeft je een duidelijk werkproces voor de twee rechten die het meest tellen: inzage en verwijdering.
Voor wat instelwerk krijg je:
- Export- en verwijderingsverzoeken gekoppeld aan een e-mail en bevestigd met een token.
- Een dashboard dat verzoeken markeert vóór de wettelijke deadline.
- Vastgelegde toestemmingen die bewijzen wie akkoord ging met je beleid, en wanneer.
- Een kaart met Mogelijkheden die documenteert welke gegevens je site verwerkt.
- Een plugin-architectuur zodat elke extensie kan meedoen in dezelfde export- en verwijderingsstroom.
Het is geen magie. De suite ziet alleen wat zijn plugins melden, het kan niet bij externe diensten of oude back-ups, en een volledige wissing vraagt nog steeds een denkend mens. Maar als basis zet het Joomla voor op de meeste platforms, die gegevensbescherming volledig aan betaalde add-ons overlaten.
Privacy is geen eenmalig vinkje; het is een doorlopende plicht. Twijfel je of je Joomla-site echt elke plek dekt waar hij persoonsgegevens opslaat, of laten je verwijderingsverzoeken iets achter, dan loont het om iemand je gegevensstromen in kaart te laten brengen en je eigen extensies in de Privacy Suite te laten koppelen, voordat een echt verzoek, of een toezichthouder, de vraag voor je stelt.
Naar boven

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.


