Configuration

Группы доступа

Группы доступа — это именованные списки отправителей, которые вы один раз определяете в accessGroups и указываете в списках разрешённых отправителей каналов с помощью accessGroup:<name>.

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

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

Статические группы отправителей сообщений

Статические группы отправителей используют type: "message.senders". members индексируется по идентификатору канала сообщений, а "*" используется для записей, общих для всех каналов:

json5
{  accessGroups: {    operators: {      type: "message.senders",      members: {        "*": ["global-owner-id"],        discord: ["discord:123456789012345678"],        telegram: ["987654321"],        whatsapp: ["+15551234567"],      },    },  },}
Ключ Значение
"*" Общие записи, проверяемые для каждого канала сообщений, ссылающегося на группу.
discord, telegram, ... Записи, проверяемые только при сопоставлении со списком разрешённых отправителей этого канала.

Записи сопоставляются по обычным правилам allowFrom целевого канала. OpenClaw не преобразует идентификаторы отправителей между каналами: если у Алисы есть идентификатор Telegram и идентификатор Discord, укажите оба идентификатора в соответствующих ключах каналов.

Ссылки на группы из списков разрешённых отправителей

Указывайте группу с помощью accessGroup:<name> в любом месте пути канала сообщений, где поддерживаются списки разрешённых отправителей.

Пример списка разрешённых отправителей личных сообщений:

json5
{  accessGroups: {    operators: {      type: "message.senders",      members: {        discord: ["discord:123456789012345678"],        telegram: ["987654321"],      },    },  },  channels: {    discord: {      dmPolicy: "allowlist",      allowFrom: ["accessGroup:operators"],    },    telegram: {      dmPolicy: "allowlist",      allowFrom: ["accessGroup:operators"],    },  },}

Пример списка разрешённых отправителей группы:

json5
{  accessGroups: {    oncall: {      type: "message.senders",      members: {        whatsapp: ["+15551234567"],        googlechat: ["users/1234567890"],      },    },  },  channels: {    whatsapp: {      groupPolicy: "allowlist",      groupAllowFrom: ["accessGroup:oncall"],    },    googlechat: {      groups: {        "spaces/AAA": {          users: ["accessGroup:oncall"],        },      },    },  },}

Группы и прямые записи можно использовать совместно:

json5
{  channels: {    discord: {      dmPolicy: "allowlist",      allowFrom: ["accessGroup:operators", "discord:123456789012345678"],    },  },}

Поддерживаемые пути каналов сообщений

Группы доступа работают в общих путях авторизации каналов сообщений:

  • списки разрешённых отправителей личных сообщений, например channels.<channel>.allowFrom
  • списки разрешённых отправителей групп, например channels.<channel>.groupAllowFrom
  • списки разрешённых отправителей для отдельных комнат конкретного канала, использующие те же правила сопоставления отправителей (например, groups.<space>.users Google Chat)
  • пути авторизации команд, повторно использующие списки разрешённых отправителей каналов сообщений

Поддержка канала зависит от того, подключён ли он к общим вспомогательным функциям OpenClaw для авторизации отправителей. В настоящее время встроенная поддержка включает ClickClack, Discord, Feishu, Google Chat, iMessage, IRC, LINE, Mattermost, Microsoft Teams, Nextcloud Talk, Nostr, QQ Bot, Signal, Slack, SMS, Telegram, WhatsApp, Zalo и Zalo Personal. Статические группы message.senders не зависят от канала, поэтому новые каналы сообщений получают их поддержку, если используют общие вспомогательные функции входящей обработки из SDK плагинов вместо собственной логики раскрытия списков разрешённых отправителей.

Аудитории каналов Discord

Discord также поддерживает динамический тип группы доступа:

json5
{  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. membership является необязательным и по умолчанию имеет значение canViewChannel.

Используйте это, когда канал Discord уже является источником достоверных данных о команде, например #maintainers или #on-call.

Требования и поведение при сбоях:

  • Боту необходим доступ к серверу и каналу.
  • Для бота в Discord Developer Portal требуется Server Members Intent.
  • Группа доступа запрещает доступ при сбое, если Discord возвращает Missing Access, отправителя невозможно определить как участника сервера или канал принадлежит другому серверу.

Дополнительные примеры для Discord: Управление доступом Discord

Диагностика плагинов

Авторы плагинов могут проверять структурированное состояние группы доступа, не преобразуя его обратно в плоский список разрешённых отправителей:

typescript
 const state = await resolveAccessGroupAllowFromState({  accessGroups: cfg.accessGroups,  allowFrom: channelConfig.allowFrom,  channel: "my-channel",  accountId: "default",  senderId,  isSenderAllowed,});

Результат содержит сведения об указанных, совпавших, отсутствующих, неподдерживаемых и завершившихся с ошибкой группах. Используйте его для диагностики или тестов соответствия. Используйте expandAllowFromWithAccessGroups(...) только для путей совместимости, которые всё ещё ожидают плоский массив allowFrom.

Примечания по безопасности

  • Группы доступа — это псевдонимы списков разрешённых отправителей, а не роли. Сами по себе они не создают владельцев, не одобряют запросы на сопряжение и не предоставляют разрешения на использование инструментов.
  • dmPolicy: "open" по-прежнему требует наличия "*" в действующем списке разрешённых отправителей личных сообщений. Ссылка на группу доступа не равнозначна публичному доступу.
  • Отсутствующие имена групп приводят к запрету доступа. Если allowFrom содержит accessGroup:operators, а accessGroups.operators отсутствует, эта запись никого не авторизует.
  • Используйте стабильные идентификаторы каналов. Если канал поддерживает оба варианта, предпочитайте числовые идентификаторы или идентификаторы пользователей отображаемым именам.

Устранение неполадок

Если отправитель должен соответствовать условию, но заблокирован:

  1. Убедитесь, что поле списка разрешённых отправителей содержит точную ссылку accessGroup:<name>.
  2. Убедитесь, что accessGroups.<name>.type указан правильно.
  3. Убедитесь, что идентификатор отправителя указан в соответствующем ключе канала или в "*".
  4. Убедитесь, что запись использует обычный синтаксис списка разрешённых отправителей этого канала.
  5. Для аудиторий каналов Discord убедитесь, что бот видит канал сервера и что Server Members Intent включён.

После изменения конфигурации управления доступом выполните openclaw doctor. Эта команда обнаруживает многие недопустимые сочетания списков разрешённых отправителей и политик до запуска.

Was this useful?
On this page

On this page