Удаление пользователя из группы с эффектом уровня доверия не пересчитывает автоматические групповые назначения пользователя

Я прочитал тему Group trust level, где сказано:

А также в более старой теме Should losing group membership unlock trust level?

Описанная ситуация в значительной степени совпадает с моим опытом:

Но вот что я обнаружил в собственном тестовом экземпляре Discourse…

При всех настройках Уровня доверия по умолчанию у меня есть учётная запись U с уровнем доверия 1 (TL1) и группа tl3, предоставляющая Trust_Level_3.

  1. Исходные условия
    • Уровень доверия: 1: базовый пользователь Разблокирован
    • Автоматические группы: trust_level_0, trust_level_1
    • Пользовательские группы: Нет
  2. Добавление U в tl3
    • Уровень доверия: 3: Регулярный Разблокирован
    • Автоматические группы: trust_level_0, trust_level_1, trust_level_2, trust_level_3
    • Пользовательские группы: tl3
  3. Удаление U из tl3
    • Уровень доверия: 2: Участник Разблокирован
    • Автоматические группы: trust_level_0, trust_level_1, trust_level_2, trust_level_3
    • Пользовательские группы: Нет
    • ПРИМЕЧАНИЕ: Несмотря на уровень доверия 2, пользователь всё ещё состоит в автоматической группе trust_level_3. Учитывая, что пользователь не может быть понижен до TL1 без заблокированного уровня доверия, ожидаемым результатом здесь должно быть немедленное исключение пользователя из автоматической группы trust_level_2.
  4. Блокировка уровня доверия U
    • Уровень доверия: 2: Участник Заблокирован
    • Автоматические группы: trust_level_0, trust_level_1, trust_level_2, trust_level_3
    • Пользовательские группы: Нет
    • ПРИМЕЧАНИЕ: Несмотря на уровень доверия 2: Участник, пользователь всё ещё состоит в автоматической группе trust_level_3.
  5. Разблокировка уровня доверия U
    • Уровень доверия: 1: Базовый Разблокирован
    • Автоматические группы: trust_level_0, trust_level_1
    • Пользовательские группы: Нет

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

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

Таким образом, вызов backend API:

POST {{site}}/admin/users/{{userId}}/groups

обновляет членство в автоматических группах, а

DELETE {{site}}/admin/users/{{usedId}}/groups/{{groupId}}

— нет, что выглядит как ошибка, особенно если вы используете автоматические группы уровней доверия для контроля доступа.

И, для полноты картины, очевидно, что вызовы:

PUT {{site}}/admin/users/{{userId}}/trust_level

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

2 лайка

Да, фундаментальная проблема разработки здесь в том, что мы должны запретить подобные манипуляции с автоматическими группами и обязать использовать только PUT {{site}}/admin/users/{{userId}}/trust_level для управления переходами. Возвращать ошибку 422 или что-то подобное, если кто-то попытается использовать конечные точки для ручного добавления или удаления людей из групп.

Изменение уровня доверия всегда должно происходить отсюда:

Поскольку это также поддерживает блокировку, что критически важно.

Я понимаю.

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

Поэтому я считаю, что если есть группа с эффектом TL3, то нажатие этой кнопки,

должно немедленно удалить пользователя из группы trust_level_3, если он не соответствует другим требованиям для уровня доверия 3 или если этот уровень доверия заблокирован.

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

Механизм повышения работает, но те же самые пользователи, удаляя кого-либо из группы с эффектом TL3, не получают немедленного эффекта удаления затронутого пользователя из trust_level_3.

Полное понимание этого — использование функции не по прямому назначению.

Просто кажется несогласованным, что пользователь может изменить свой уровень доверия с 3 на 2, но при этом оставаться в группе trust_level_3 до следующего события пересчета.}

2 лайка