Laravel Package

Persoonsgegevens verzamelen en exporteren

Verzamelt alle persoonsgegevens van één betrokkene over meerdere modellen en exporteert ze read-only naar JSON of Markdown. Voor het inzageverzoek uit artikel vijftien van de AVG.

Installation

composer require ginkelsoft/laravel-data-subject-access

Alles tonen, zonder iets te wijzigen

Een betrokkene heeft het recht om te weten welke persoonsgegevens je van hem hebt, en die op te vragen. Dat is artikel vijftien van de AVG, het recht van inzage, en in JSON-vorm dekt het meteen de dataportabiliteit van artikel twintig. Anders dan bij vergetelheid of bewaartermijnen wordt hier niets gewijzigd of verwijderd. Het is puur verzamelen en overhandigen.

Het lastige is de spreiding. De gegevens van één persoon zitten verspreid over users, profielen, orders en meer. En je wilt niet zomaar alle kolommen exporteren, want sommige zijn intern of technisch en horen niet in handen van de betrokkene. Dit package verzamelt gericht en laat jou bepalen wat eruit mag.

Opt-in per veld

Per model geef je expliciet op welke velden in de export horen, met een leesbaar label erbij. Automatisch alle kolommen meenemen doet dit package bewust niet, want interne vlaggen, foreign keys en gehashte waarden horen er niet in. Je kunt per veld ook een transform meegeven, bijvoorbeeld om een datum te formatteren.

use Ginkelsoft\DataSubjectAccess\Attributes\Exportable;
use Ginkelsoft\DataSubjectAccess\Concerns\Exportable as ExportableTrait;
use Ginkelsoft\DataSubjectAccess\Contracts\Exportable as ExportableContract;

class Profile extends Model implements ExportableContract
{
    use ExportableTrait;

    protected array $exportable = [
        'column' => 'user_id',
        'fields' => [
            'first_name' => 'Voornaam',
            'last_name'  => 'Achternaam',
            'email'      => ['label' => 'E-mailadres'],
        ],
    ];
}

Exporteren

Een command verzamelt alles van één subject en levert het in JSON of Markdown. Zonder uitvoerpad gaat het naar de standaarduitvoer, zodat je het kunt doorsluizen, met een uitvoerpad belandt het in een bestand.

php artisan retention:export 01HXYZ --format=markdown
php artisan retention:export 01HXYZ --format=json --output=storage/exports/01HXYZ.json

De twee formaten zitten standaard in het package. Wil je een ander formaat, bijvoorbeeld HTML, CSV of PDF, dan implementeer je het Exporter-contract zonder de rest van het package aan te raken. PDF zit er bewust niet in, omdat dat een zware dependency zou meebrengen voor iets wat je per project beter zelf invult.

Aantonen zonder te lekken

Een inzageverzoek is zelf ook een verwerking, dus het wordt gelogd. Per model waar het subject gegevens had komt een regel met een onomkeerbare subject-hash in plaats van de identiteit, en het aantal gevonden records. De geëxporteerde inhoud zelf gaat nooit het log in. De hash-keten blijft daarmee intact en controleerbaar.

Identiteitscontrole is aan jou

Dit package controleert niet of de aanvrager ook echt de betrokkene is. Dat is een zaak voor je applicatie, bijvoorbeeld een geverifieerde e-mail of een ingelogde sessie. Een export draaien op een ongeverifieerde identifier is een datalek in wording, dus regel die controle vóór je het command aanroept.

Samen met vergetelheid in één model

Draagt een model zowel dit package als het package voor het recht op vergetelheid, dan definiëren beide een forSubjectQuery en vraagt PHP om een expliciete keuze met een insteadof-clausule. Wanneer beide dezelfde subject-kolom gebruiken, het gewone geval, maakt het niet uit welke je kiest. De README laat het volledige voorbeeld zien.

Open source, MIT

Open source onder de MIT-licentie, beschikbaar via GitHub en Packagist. Het bouwt op Compliance Core.

composer require ginkelsoft/laravel-data-subject-access

Onderdeel van de AVG-familie naast bewaartermijnen, vergetelheid, toestemming en het datalek-register. Hulp bij het inpassen valt onder maatwerk software en onderhoud en doorontwikkeling.