Работа с персональными данными в Joomla 4 / Joomla 5

Изображение от DilokaStudio на Freepik
Изображение от DilokaStudio на Freepik

На любом сайте, где есть хоть формы обратной связи, регистрация пользователей происходит получение персональных данных и мы обязаны разместить на сайте политику обработки персональных данных.

Сразу оговорюсь о формах обратной связи: любопытный случай, когда Верховный Суд России отказался признать адрес электронной почты персональными данными зарегистрировавшего ее человека, так как в этой форме запрашивались только номер телефона и e-mail (без Ф.И.О.) - 21 июля 2023 года (источник).

В статье пойдёт речь о тех случаях, когда данные всё-таки являются персональными. В тексте политики обработки персональных данных на сайте обычно предусматриваются разделы, в которых описываются механизмы по получению пользователем сайта своих персональных данных, а также способы запросить их уничтожение. В законе №152-ФЗ есть объёмная статья 14 "Право субъекта персональных данных на доступ к его персональным данным", которая говорит о том, что человек, чьи персональные данные хранятся на сайте, имеет право их увидеть. То есть речь идёт о простом личном кабинете с возможностью посмотреть (и естественно отредактировать) свои данные.

То, о чём должна сообщать политика обработки персональных данных кратко освещается в статье 18.1. Статья 20 п.3 говорит об обязанности уничтожить персональные данные по запросу, в случае если было доказано неправомерное их получение. Чуть ниже пункты 4 и 5 этой же статьи говорят, что удалять всё нужно когда "достигнуты цели" или "в случае обращения субъекта персональных данных к оператору с требованием о прекращении обработки персональных данных".

Вольный пересказ этих статей сводится к тому, что нам нужно предоставить возможность пользователю:

  • увидеть свои персональные данные
  • изменить свои персональные данные
  • отправить запрос на получение своих персональных данных
  • отправить запрос на удаление своих персональных данных
  • получить уведомления в случае отправки запросов, а так же результатов их обработки

Первые два пункта относятся к функционалу типового личного кабинета. В рамках Joomla реализовать его можно разными способами, поэтому я не буду заострять на этом внимание, а сфокусируемся мы на том, как обеспечить запросы на экспорт и удаление данных.

Компонент "Персональные данные" (com_privacy) в Joomla

Этот компонент появился ещё в Joomla 3.9, довольно давно. Компонент является частью ядра Joomla, его не нужно устанавливать дополнительно. Работа его в Joomla 3.9, 4.x и 5.0 одинакова. В рассказе будем опираться на новенькую Joomla 5.

Увидеть его можно, если в боковом меню выбрать Пользователи - Персональные данные.

Работа с персональными данными в Joomla 4 / Joomla 5

Мы увидим всего 3 раздела - запросы данных, возможности расширений и согласия пользователей.

Раздел "Возможности расширений" в персональных данных Joomla

В этом разделе информация собрана из установленных расширений, которые информируют о собственных возможностях, связанных с политикой конфиденциальности. Она предназначена для того, чтобы помочь администраторам сайтов создавать локальные политики сайта, такие как политика обработки персональных данных пользователей. На странице отображается информация только из включенных расширений, поэтому список не следует рассматривать как полный - для получения дополнительной информации необходимо ознакомиться с документацией каждого расширения.

Добавленное плагином описание работы с персональными данными
Добавленное плагином описание работы с персональными данными

В этом разделе разработчики расширений (компонентов, модулей, плагинов) должны описать механику работы с персональными данными - как именно и зачем.

С технической точки зрения разработчики должны создать плагин группы privacy, в котором должен быть реализован метод onPrivacyCollectAdminCapabilities().

<?php public function onPrivacyCollectAdminCapabilities() { $this->loadLanguage(); $app = Joomla\CMS\Factory::getApplication(); return [ $app->getLanguage()->_('Название расширения, компонента') => [ $app->getLanguage()->_('А здесь интересный текст о том, что именно хранит и как обрабатывает компонент'), ], ]; }

Тогда описание попадёт в список расширений на скриншоте. Это позволит дать аргументированные ответы на ответы пользователей или регулирующих органов. Заметим, что предоставить эту информацию должны разработчики расширений.

Раздел "Согласия пользователей" компонента "Персональные данные"

Работа с персональными данными в Joomla 4 / Joomla 5

В этом разделе в виде простой таблички находится список пользователей и их согласий на обработку персональных данных. С помощью флажков в статусе мы можем вручную аннулировать согласие конкретного пользователя, тогда при следующем входе (в зависимости от настроек плагинов пользователя и авторизации) его перенаправят в личный кабинет, чтобы ещё раз принять Ваши условия.

Работа с персональными данными в Joomla 4 / Joomla 5

Это может пригодиться в том случае, если Вы обновили текст политики обработки персональных данных и Вам нужно точно знать, что люди с ним согласились (хоть его никто никогда и не читает, но при решении юридических споров это не будет волновать, например, судей).

Работа с персональными данными в Joomla 4 / Joomla 5

Раздел "Запросы данных" компонента "Персональные данные" Joomla

В этом разделе находятся собственно созданные пользователями запросы на выгрузку персональных данных пользователей (экспорт) и запросы на удаление (уничтожение) персональных данных в Joomla.

Работа с персональными данными в Joomla 4 / Joomla 5

Также можно вручную создать такой запрос из админки.

Работа с персональными данными в Joomla 4 / Joomla 5

Поскольку аккаунты в Joomla не могут существовать без email - email является ключевой для запросов сущностью.

Работа с персональными данными в Joomla 4 / Joomla 5

Уведомления о поступивших запросах:

  • поступают в системы личных сообщений админки Joomla
  • видны на дашборде при входе в панель управления
  • отправляются на почту сайта

Для нас самое важное - это дать возможность пользователю создавать запросы на экспорт и удаление данных, поэтому...

Как настроить запросы на экспорт и уничтожение персональных данных в Joomla?

При создании пунктов меню у нас есть возможность создать 3 пункта меню для управления персональными данными разных типов.

Работа с персональными данными в Joomla 4 / Joomla 5

Для всех трёх пунктов меню мы имеем в виду, что они нужны только авторизованным пользователям, поэтому не забудьте установить группу доступа "Зарегистрированные пользователи" ("Registered").

Начнём с последнего, "Создать запрос".

В этом пункте меню открывается форма создания запроса, где можно выбрать цель запроса: экспорт или удаление персональных данных. Перед отправкой запроса нужно обязательно вновь установить чекбокс согласия с политикой обработки персональных данных, дабы мы совершали осознанное действие.

Работа с персональными данными в Joomla 4 / Joomla 5

Если для текущего пользователя уже был создан необработанный запрос, то мы увидим сообщение:

Не удалось создать запрос персональных данных. Для адреса электронной почты и типа запроса персональных данных существует активный запрос. Пожалуйста, обратитесь к администрации сайта для получения информации по запросу.

Joomla 5

Если же запрос создан в первый раз, то пользователю на email будет отправлено письмо для подтверждения запроса следующего вида:

Работа с персональными данными в Joomla 4 / Joomla 5

Как мы видим, предлагается 2 варианта подтверждения: переход по ссылке или скопировать и вставить в форму подтверждения код. Они равнозначны и по сути являются одной и той же формой. В случае, если мы переходим по ссылке - форма заполняется автоматически.

Работа с персональными данными в Joomla 4 / Joomla 5

Здесь нам пригодится второй тип пункта меню для компонента персональных данных - "Подтвердить запрос".

Аналогичное письмо будет отправлено на почту пользователю и в случае запроса на удаление данных

Работа с персональными данными в Joomla 4 / Joomla 5

В случае, если запрошена копия персональных данных пользователя Joomla-сайта, ему на почту придёт письмо с xml-файлом примерно такого содержания.

<?xml version="1.0" encoding="utf-8"?> <data-export> <domain name="user_action_logs" description="joomla_user_action_logs_data"> <item> <id>1348</id> <message>Пользователь test1 зарегистрировался на сайте</message> <extension>Пользователи</extension> <date>2023-10-31 08:01:20 UTC</date> <name>Сергей</name> <ip_address>COM_ACTIONLOGS_DISABLED</ip_address> </item> <item> <id>1349</id> <message>Пользователь test1 дал согласие на обработку и хранение персональных данных</message> <extension>Система - Персональные данные</extension> <date>2023-10-31 08:01:20 UTC</date> <name>Сергей</name> <ip_address>COM_ACTIONLOGS_DISABLED</ip_address> </item> <item> <id>1377</id> <message>Неудачная попытка входа в систему под учетной записью test1</message> <extension>Пользователи</extension> <date>2023-10-31 08:40:04 UTC</date> <name>Сергей</name> <ip_address>COM_ACTIONLOGS_DISABLED</ip_address> </item> <item> <id>1381</id> <message>Пользователь test1 вошел в систему</message> <extension>Пользователи</extension> <date>2023-10-31 08:40:37 UTC</date> <name>Сергей</name> <ip_address>COM_ACTIONLOGS_DISABLED</ip_address> </item> </domain> </data-export>

Файл может быть довольно большим, особенно если ведется запись действий пользователей на сайте.

Обратите внимание, что ВСЕ действия над персональными данными в рамках запроса доступны лишь ПОСЛЕ подтверждения пользователем. Без этого подтверждения у Вас не будет кнопок действий для запроса.

Работа с персональными данными в Joomla 4 / Joomla 5

Третий тип пункта меню - "Продлить согласие". На этой странице предлагается самостоятельно указать email и код подтверждения.

Работа с персональными данными в Joomla 4 / Joomla 5

Запрос на уничтожение персональных данных - что произойдет?

Joomla сохранит пользователя как сущность - в CMS останется его user id, но будут удалены все персональные данные, позволяющие его идентифицировать: имя, email, лог действий, данные в сторонних компонентах и расширениях. Результат удаления данных будет выглядеть следующим образом:

Результат удаления персональных данных в Joomla 5
Результат удаления персональных данных в Joomla 5

Логика действий пользователя при запросах на получение или уничтожение персональных данных на Joomla сайтах

Этот алгоритм можно описать в тексте политики обработки персональных данных.

  • Пользователь: авторизуется (входит на сайт)
  • Пользователь: Переходит в пункт меню "Создать запрос" для пользователей
  • Пользователь: Выбирает тип запроса: "экспорт" или "удалить", соглашается с политикой обработки персональных данных (чекбокс) и отправляет форму
  • Администратор сайта: получает уведомления на свою почту, в личные сообщения в админ панели Joomla, видит данные на дашборде при входе в админку
  • Администратор сайта: просматривает список запросов на операции с персональными данными, но ничего не может сними сделать. Видит только какой именно пользователь сделал запрос.
  • Пользователь: получает на почту письмо с предложением подтвердить свои намерения путём перехода по ссылке или ручного ввода кода подтверждения на сайте.
  • Пользователь: подтверждает свои намерения, введя код одним из предложенных способов.
  • Администратор сайта: получает уведомление на почту, в личные сообщения о смене статусе запроса. С этого момента можно (как мне видится) отсчитывать юридически значимые сроки исполнения, так как до этого у администратора сайта нет возможности что-либо сделать.
  • Администратор сайта: заходит в панель управления Joomla, в компоненте "Персональные данные" выполняет запрошенную операцию над персональными данными.
  • Администратор сайта: внутри запроса нажимает кнопку "завершить".

Раньше в тексте политики обработки персональных данных описывались процедуры, где нужно написать на специальный email (письмо может попасть в спам, не дойти, его просто не заметят) или приехать в офис и написать заявление. Теперь можно использовать встроенный в Joomla функционал для этих обеспечения юридически важных механизмов.

Что нужно сделать Joomla-разработчикам для добавления в компонент персональных данных своих расширений?

Как уже писал выше, для того чтобы добавить информацию о механике работы с персональными данными в Joomla, разработчикам нужно использовать событие для плагинов onPrivacyCollectAdminCapabilities().

Для реализации возможности экспорта персональных данных из своего компонента нужно реализовать в своём плагине метод onPrivacyExportRequest(). Ниже пример реализации метода в плагине "Персональные данные - Пользователь" группы privacy.

<?php /** * Processes an export request for Joomla core user data * * This event will collect data for the following core tables: * * - #__users (excluding the password, otpKey, and otep columns) * - #__user_notes * - #__user_profiles * - User custom fields * * @param RequestTable $request The request record being processed * @param User $user The user account associated with this request if available * * @return \Joomla\Component\Privacy\Administrator\Export\Domain[] * * @since 3.9.0 */ public function onPrivacyExportRequest(RequestTable $request, User $user = null) { if (!$user) { return []; } /** @var TableUser $userTable */ $userTable = User::getTable(); $userTable->load($user->id); $domains = []; $domains[] = $this->createUserDomain($userTable); $domains[] = $this->createNotesDomain($userTable); $domains[] = $this->createProfileDomain($userTable); $domains[] = $this->createCustomFieldsDomain('com_users.user', [$userTable]); return $domains; }

Для реализации возможности уничтожения персональных данных нужно реализовать в своём плагине метод onPrivacyRemoveData(). Здесь происходит собственно уничтожение данных: либо заполняются сгенерированные данные, либо полностью удаляем из базы данных все упоминания. Пример кода из того же плагина.

<?php /** * Removes the data associated with a remove information request * * This event will pseudoanonymise the user account * * @param RequestTable $request The request record being processed * @param User $user The user account associated with this request if available * * @return void * * @since 3.9.0 */ public function onPrivacyRemoveData(RequestTable $request, User $user = null) { // This plugin only processes data for registered user accounts if (!$user) { return; } $pseudoanonymisedData = [ 'name' => 'User ID ' . $user->id, 'username' => bin2hex(random_bytes(12)), 'email' => 'UserID' . $user->id . 'removed@email.invalid', 'block' => true, ]; $user->bind($pseudoanonymisedData); $user->save(); // Destroy all sessions for the user account UserHelper::destroyUserSessions($user->id); }

Перед экспортом или удалением лучше проверить, а может ли текущий пользователь в панели управления сайта удалять персональные данные. Эти проверки осуществляются по триггеру onPrivacyCanRemoveData(). Пример кода из того же плагина:

<?php /** * Performs validation to determine if the data associated with a remove information request can be processed * * This event will not allow a super user account to be removed * * @param RequestTable $request The request record being processed * @param User $user The user account associated with this request if available * * @return Status * * @since 3.9.0 */ public function onPrivacyCanRemoveData(RequestTable $request, User $user = null) { $status = new Status(); if (!$user) { return $status; } if ($user->authorise('core.admin')) { $status->canRemove = false; $status->reason = Text::_('PLG_PRIVACY_USER_ERROR_CANNOT_REMOVE_SUPER_USER'); } return $status; }

Разработчики популярных сторонних расширений обычно имеют в комплекте плагины для работы с персональными данными. Здесь нужно быть внимательным, так как функционал может быть реализован не полностью. Например, данные для экспорта персональных данных предоставляются, а для удаления - нет. Или наоборот.

Примеры плагинов работы с персональными данными:

  • компонент интернет-магазина JoomShopping - бесплатный плагин Privacy Consent
  • компонент календаря событий DP Calendar в бесплатной версии пакета имеет плагин персональных данных. Именно в нём на момент написания статьи реализован функционал только выгрузки персональных данных. Функционала удаления нет.

Также будет полезной ссылка на официальную документацию Joomla (на русском языке) по настройке этого функционала.

Полезные ресурсы

Ресурсы Joomla сообщества

Joomla в Telegram

44
3 комментария

кстати очень полезная функция для новых сайтов. Удивительно, что такой внушительный функционал идет прямо в коробке бесплатной CMS. Отдельное спасибо Joomla

Век живи — век учись. А не подскажете, в WP есть "из коробки" такой функционал? Ну, так, чтоб не ставить 100500 плагинов от неизвестных разработчиков.

Красота из коробки. Ай да Joomla 👍