
Язык 🇷🇺 Русский
Общие сведения
Реализация
Что такое контроль доступа? 
С помощью FastComments SSO Access Control, иногда называемого RBAC, доступ пользователей можно ограничивать только определёнными страницами или ветками комментариев. Кроме того,
пользователи могут @mention друг друга только в одной и той же группе.
Подробно
Мы можем помещать Users и опционально Pages в группы.
Когда Users помещены в группы, и Limit Comments by SSO User Groups включено в настройках виджета, тогда пользователи
будут видеть только комментарии от пользователей из их же групп и смогут @mention только пользователей из тех же групп.
Кроме того, Pages можно помещать в группы, и тогда пользователи смогут получать доступ только к комментариям на страницах, к которым они имеют доступ.
Мы называем это группами уровня пользователя и группами уровня страницы.
Так какой из них подходит вам?
Используйте группы уровня пользователя, если...
- Вы хотите использовать одно и то же значение
urlId(URL страницы или идентификатор статьи), но ограничить комментарии по группам. - Например, вы хотите иметь группы «Новый пользователь» и «Ветеран», и они никогда не должны видеть комментарии друг друга на одних и тех же страницах.
Используйте группы уровня страницы, если...
- Ваши группы привязаны к определённым страницам.
- Например, пользователи в группе «Публичные страницы» никогда не должны просматривать статьи из раздела «Совершенно секретно».
Как это работает 
FastComments Access Control работает путем назначения Pages и Users в нужные группы.
Группа — это просто строковый идентификатор, например GREEN или abc-123.
Users и Pages не ограничены одной группой. Они ограничены 100 и 1000 группами соответственно.
Доступ к неавторизованным страницам
Если пользователь пытается получить доступ к странице, к которой у него нет прав, он увидит сообщение об ошибке, подобное приведенному ниже:
Текст сообщения может быть настроен.
Спецификация 
Определять, как несколько пользователей взаимодействуют, и тестировать это — сложно. Ниже приведена спецификация, которой мы следуем для контроля доступа, которую вы можете использовать для тестирования вашей реализации:
Страница с null идентификаторами групп, пользователь с null идентификаторами групп - должен иметь доступ.
Страница с null идентификаторами групп, пользователь с идентификаторами групп - должен иметь доступ.
Страница с идентификаторами групп, пользователь с null идентификаторами групп - должен иметь доступ.
Страница с идентификаторами групп, пользователь с пустым списком - НЕ должен иметь доступ.
Страница с идентификаторами групп, пользователь с идентификаторами групп - существует пересечение - должен иметь доступ.
Страница с идентификаторами групп, пользователь с идентификаторами групп - пересечения не существует - НЕ должен иметь доступ.
Страница с пустым списком идентификаторов групп (никому не разрешён доступ), пользователь с null - НЕ должен иметь доступ.
SSO User A = идентификаторы групп не заданы (null = полный доступ).
SSO User B = идентификаторы групп не заданы (null = полный доступ).
A может @B.
SSO User A = идентификаторы групп не заданы (null = полный доступ).
SSO User B = идентификаторы групп заданы.
A может @B.
SSO User A = идентификаторы групп заданы.
SSO User B = идентификаторы групп не заданы (null = полный доступ).
A может @B.
SSO User A = идентификаторы групп = [a].
SSO User B = идентификаторы групп = [b].
A НЕ может @B.
SSO User A = идентификаторы групп = [a].
SSO User B = идентификаторы групп = [a, b].
A может @B.Реализация 
Упоминание пользователей из других групп
Если два пользователя принадлежат к двум разным наборам групп, и у них нет пересечения, они не смогут @mention друг друга.
Если пользователь вручную вводит @mention и отправляет свой комментарий, оно останется обычным текстом. Другой пользователь не будет помечен.
Управление группами
Groups определяются с помощью API-ресурсов Pages и SSOUsers, соответственно.
К API Pages можно обращаться, чтобы определить набор групп, которым разрешён доступ к странице. По умолчанию доступ имеют все группы, а также пользователи, которые не принадлежат ни к одной группе.
Аналогично, к API SSOUsers можно обращаться, чтобы определить группы, связанные с каждым пользователем.
Для обоих ресурсов нет ограничений относительно того, когда группы могут быть заданы или обновлены.
Если требуется только ограничить возможность @mention пользователей друг друга, то Pages можно не учитывать.
Примечание!
Определение и обновление групп пользователей SSO не требует использования API и может выполняться автоматически путём определения group ids в SSO payload, передаваемом виджету комментариев. Однако для больших списков групп это не рекомендуется, так как пользователю придётся отправлять этот payload при каждой загрузке страницы.
Примеры вызовов API 
Здесь мы пройдемся по вызову API FastComments для настройки управления доступом.
Прежде чем начать, обратите внимание, что нам не нужно явно создавать структуру Group. Группы — это просто идентификаторы
добавляемые к Users и Pages. Добавление группы пользователю или странице автоматически "создает" группу.
Сначала давайте создадим двух пользователей, User A и User B, и добавим их в Group X:


Теперь давайте создадим Page. Назовем её Confidential Page, и пока ни один из этих пользователей не будет иметь к ней доступа, так как она будет
в группе CONFIDENTIAL:

Пользователи A и B в настоящее время НЕ имеют доступа к новой странице. Однако, поскольку они находятся в одной группе, GROUP-X, они могут @mention друг друга.
Давайте обновим User B, чтобы он теперь мог получить доступ к странице:

User B теперь принадлежит обеим группам. Наши пользователи всё ещё могут @mention друг друга, но просматривать конфиденциальную страницу может только User B.
Сделаем так, чтобы User B мог просматривать только конфиденциальную страницу:

Теперь он может просматривать конфиденциальную страницу, но ни один из наших пользователей не может @mention другого, так как они находятся в разных группах.
Однако любой пользователь, не являющийся частью контроля доступа, сможет получить доступ к нашей странице. Чтобы предотвратить это, убедитесь, что у ни одного SSO Users значение groupIds не установлено в null. Например, давайте создадим User C, который имеет доступ ко всему:

Установив groupIds в null, мы указываем, что они не ограничены контролем доступа.
Теперь давайте создадим страницу, к которой есть доступ у всех:

Установив accessibleByGroupIds в null, мы указываем, что эта Page не контролируется через систему управления доступом, и оба пользователя могут получить к ней доступ.
На этом наше руководство по работе с API для управления доступом завершено.