Хорошо, у меня наконец есть черновая версия, которой я могу поделиться здесь:
Несколько замечаний.
Для первоначальной реализации я выбрал чуть более сложный вариант с группами Google Apps для доменов (hd), так как это помогает продумать возможные комбинации, например, необходимость учёта групп, специфичных для домена, от провайдера.
Чтобы реализовать этот сценарий, мне также пришлось ввести новую концепцию «вторичной авторизации» в момент аутентификации, чтобы обеспечить постепенную авторизацию. Я рассмотрел несколько способов реализации запроса на получение разрешений для групп конкретного пользователя (например, при аутентификации с hd), и этот вариант показался наиболее жизнеспособным. Признаю, что это, возможно, более значительное изменение в этой области, чем ожидалось, но его, пожалуй, стоит обсудить.
Обратите внимание: для реализации работы с группами Google hd необходимо предоставить обычным членам групп Google Apps hd делегированные права администратора, чтобы они могли просматривать свои группы (через API административного каталога). На самом деле существует встроенная «бета»-роль администратора под названием «Groups Reader», которая отлично подходит для этой задачи. Подробнее см. Prebuilt administrator roles | User management | Google Workspace Help
Реализация для Google работает. Если вы настроите её и затем аутентифицируетесь с hd, ваши группы Google hd станут доступны в настройках автоматического членства в группах. Вы будете добавляться в группу Discourse, если выбрана соответствующая группа hd, и удаляться из неё при удалении группы hd (оба действия будут подробно регистрироваться в логах). Последующие пользователи из той же группы Google hd при аутентификации будут добавляться немедленно.
Детали должны быть очевидны из кода и тестов. Вы также заметите, что мне пришлось добавить три новые таблицы. Я пробовал несколько более «лёгких» решений, но они оказались более запутанными и неэффективными при обработке обновлений связанных групп пользователя и связанных групп группы. Избежать создания новых таблиц для каждой задачи сложно. Открыт к идеям в области моделирования данных, а также в целом.
Осталось несколько технических задач (помимо концептуальных и продуктовых вопросов, поднятых выше). Предложения также приветствуются:
- Возможно, стоит сериализовать поле
labelдля associated_groups (вместо моделирования на стороне клиента). - Добавить недостающие тесты и юнит-тесты.
- Возможно, перенести создание/удаление записей user_associated_group и group_associated_group в фоновую задачу, так как при большом количестве операций это может работать медленно.