Configuration
Группы доступа
Группы доступа — это именованные списки отправителей, которые вы определяете один раз и на которые ссылаетесь из списков разрешений каналов через accessGroup:<name>.
Используйте их, когда одни и те же люди должны быть разрешены в нескольких каналах сообщений или когда один доверенный набор должен применяться и к авторизации отправителей в личных сообщениях, и к авторизации отправителей в группах.
Группы доступа сами по себе не предоставляют доступ. Группа имеет значение только тогда, когда поле списка разрешений ссылается на нее.
Статические группы отправителей сообщений
Статические группы отправителей используют type: "message.senders".
{ accessGroups: { operators: { type: "message.senders", members: { "*": ["global-owner-id"], discord: ["discord:123456789012345678"], telegram: ["987654321"], whatsapp: ["+15551234567"], }, }, },}Списки участников индексируются по идентификатору канала сообщений:
| Ключ | Значение |
|---|---|
"*" |
Общие записи, проверяемые для каждого канала сообщений, который ссылается на группу. |
discord |
Записи, проверяемые только при сопоставлении со списком разрешений Discord. |
telegram |
Записи, проверяемые только при сопоставлении со списком разрешений Telegram. |
whatsapp |
Записи, проверяемые только при сопоставлении со списком разрешений WhatsApp. |
Записи сопоставляются с обычными правилами allowFrom целевого канала. OpenClaw не преобразует идентификаторы отправителей между каналами. Если у Alice есть идентификатор Telegram и идентификатор Discord, укажите оба идентификатора под соответствующими ключами.
Ссылка на группы из списков разрешений
Ссылайтесь на группу через accessGroup:<name> в любом месте, где путь канала сообщений поддерживает списки разрешенных отправителей.
Пример списка разрешений для личных сообщений:
{ accessGroups: { operators: { type: "message.senders", members: { discord: ["discord:123456789012345678"], telegram: ["987654321"], }, }, }, channels: { discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators"], }, telegram: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators"], }, },}Пример списка разрешенных отправителей группы:
{ accessGroups: { oncall: { type: "message.senders", members: { whatsapp: ["+15551234567"], googlechat: ["users/1234567890"], }, }, }, channels: { whatsapp: { groupPolicy: "allowlist", groupAllowFrom: ["accessGroup:oncall"], }, googlechat: { spaces: { "spaces/AAA": { users: ["accessGroup:oncall"], }, }, }, },}Можно смешивать группы и прямые записи:
{ channels: { discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:operators", "discord:123456789012345678"], }, },}Поддерживаемые пути каналов сообщений
Группы доступа доступны в общих путях авторизации каналов сообщений, включая:
- списки разрешенных отправителей личных сообщений, такие как
channels.<channel>.allowFrom - списки разрешенных отправителей групп, такие как
channels.<channel>.groupAllowFrom - списки разрешенных отправителей для отдельных комнат, специфичные для канала и использующие те же правила сопоставления отправителей
- пути авторизации команд, которые повторно используют списки разрешенных отправителей каналов сообщений
Поддержка канала зависит от того, подключен ли этот канал через общие помощники OpenClaw для авторизации отправителей. Текущая встроенная поддержка включает Discord, Feishu, Google Chat, iMessage, LINE, Mattermost, Microsoft Teams, Nextcloud Talk, Nostr, QQBot, Signal, WhatsApp, Zalo и Zalo Personal. Статические группы message.senders спроектированы как независимые от канала, поэтому новые каналы сообщений должны поддерживать их, используя общие помощники plugin SDK вместо пользовательского расширения списков разрешений.
Диагностика Plugin
Авторы Plugin могут инспектировать структурированное состояние групп доступа, не разворачивая его обратно в плоский список разрешений:
const state = await resolveAccessGroupAllowFromState({ accessGroups: cfg.accessGroups, allowFrom: channelConfig.allowFrom, channel: "my-channel", accountId: "default", senderId, isSenderAllowed,});Результат сообщает о группах, на которые есть ссылки, которые совпали, отсутствуют, не поддерживаются или завершились ошибкой. Используйте это, когда нужны диагностика или тесты соответствия. Используйте expandAllowFromWithAccessGroups(...) только для путей совместимости, которые все еще ожидают плоский массив allowFrom.
Аудитории каналов Discord
Discord также поддерживает динамический тип группы доступа:
{ accessGroups: { maintainers: { type: "discord.channelAudience", guildId: "1456350064065904867", channelId: "1456744319972282449", membership: "canViewChannel", }, }, channels: { discord: { dmPolicy: "allowlist", allowFrom: ["accessGroup:maintainers"], }, },}discord.channelAudience означает «разрешить отправителей личных сообщений Discord, которые сейчас могут просматривать этот канал гильдии». OpenClaw разрешает отправителя через Discord во время авторизации и применяет правила разрешений Discord ViewChannel.
Используйте это, когда канал Discord уже является источником истины для команды, например #maintainers или #on-call.
Требования и поведение при сбоях:
- Боту нужен доступ к гильдии и каналу.
- Боту нужно намерение участников сервера в Discord Developer Portal.
- Группа доступа закрывается при сбое, когда Discord возвращает
Missing Access, отправителя нельзя разрешить как участника гильдии или канал принадлежит другой гильдии.
Больше примеров для Discord: Управление доступом Discord
Примечания по безопасности
- Группы доступа — это псевдонимы списков разрешений, а не роли. Сами по себе они не создают владельцев, не одобряют запросы сопряжения и не предоставляют разрешения на инструменты.
dmPolicy: "open"по-прежнему требует"*"в эффективном списке разрешений для личных сообщений. Ссылка на группу доступа не равнозначна публичному доступу.- Отсутствующие имена групп закрываются при сбое. Если
allowFromсодержитaccessGroup:operators, аaccessGroups.operatorsотсутствует, эта запись никого не авторизует. - Сохраняйте стабильность идентификаторов каналов. Предпочитайте числовые или пользовательские идентификаторы отображаемым именам, когда канал поддерживает оба варианта.
Устранение неполадок
Если отправитель должен совпадать, но блокируется:
- Убедитесь, что поле списка разрешений содержит точную ссылку
accessGroup:<name>. - Убедитесь, что
accessGroups.<name>.typeуказан правильно. - Убедитесь, что идентификатор отправителя указан под соответствующим ключом канала или под
"*". - Убедитесь, что запись использует обычный синтаксис списка разрешений этого канала.
- Для аудиторий каналов Discord убедитесь, что бот видит канал гильдии и что намерение участников сервера включено.
Запустите openclaw doctor после редактирования конфигурации управления доступом. Он обнаруживает многие недопустимые сочетания списков разрешений и политик до выполнения.