Configuration

กลุ่มการเข้าถึง

กลุ่มการเข้าถึงคือรายการผู้ส่งที่ตั้งชื่อไว้ ซึ่งคุณกำหนดครั้งเดียวแล้วอ้างอิงจากรายการอนุญาตของช่องทางด้วย accessGroup:<name>

ใช้เมื่อควรอนุญาตให้คนกลุ่มเดียวกันเข้าถึงได้ในหลายช่องทางข้อความ หรือเมื่อชุดผู้ที่เชื่อถือได้ชุดหนึ่งควรใช้กับทั้งการอนุญาตผู้ส่งใน DM และในกลุ่ม

กลุ่มการเข้าถึงไม่ได้ให้สิทธิ์เข้าถึงด้วยตัวเอง กลุ่มจะมีผลก็ต่อเมื่อฟิลด์รายการอนุญาตอ้างอิงถึงกลุ่มนั้น

กลุ่มผู้ส่งข้อความแบบคงที่

กลุ่มผู้ส่งแบบคงที่ใช้ type: "message.senders"

json5
{  accessGroups: {    operators: {      type: "message.senders",      members: {        "*": ["global-owner-id"],        discord: ["discord:123456789012345678"],        telegram: ["987654321"],        whatsapp: ["+15551234567"],      },    },  },}

รายการสมาชิกใช้ id ของช่องทางข้อความเป็นคีย์:

คีย์ ความหมาย
"*" รายการร่วมที่ตรวจสอบสำหรับทุกช่องทางข้อความที่อ้างอิงกลุ่มนี้
discord รายการที่ตรวจสอบเฉพาะการจับคู่รายการอนุญาตของ Discord
telegram รายการที่ตรวจสอบเฉพาะการจับคู่รายการอนุญาตของ Telegram
whatsapp รายการที่ตรวจสอบเฉพาะการจับคู่รายการอนุญาตของ WhatsApp

รายการต่างๆ จะถูกจับคู่ด้วยกฎ allowFrom ปกติของช่องทางปลายทาง OpenClaw ไม่แปลง id ผู้ส่งระหว่างช่องทาง หาก Alice มี id ของ Telegram และ id ของ Discord ให้ระบุทั้งสอง id ใต้คีย์ที่เหมาะสม

อ้างอิงกลุ่มจากรายการอนุญาต

อ้างอิงกลุ่มด้วย accessGroup:<name> ได้ทุกที่ที่พาธของช่องทางข้อความรองรับรายการอนุญาตผู้ส่ง

ตัวอย่างรายการอนุญาตของ DM:

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: {      spaces: {        "spaces/AAA": {          users: ["accessGroup:oncall"],        },      },    },  },}

คุณสามารถใช้กลุ่มและรายการโดยตรงร่วมกันได้:

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

พาธของช่องทางข้อความที่รองรับ

กลุ่มการเข้าถึงพร้อมใช้งานในพาธการอนุญาตของช่องทางข้อความที่ใช้ร่วมกัน รวมถึง:

  • รายการอนุญาตผู้ส่ง DM เช่น 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 แบบคงที่ออกแบบมาให้ไม่ผูกกับช่องทาง ดังนั้นช่องทางข้อความใหม่ควรรองรับกลุ่มเหล่านี้โดยใช้ตัวช่วย SDK ของ Plugin ที่ใช้ร่วมกัน แทนการขยายรายการอนุญาตแบบกำหนดเอง

การวินิจฉัยของ Plugin

ผู้เขียน Plugin สามารถตรวจสอบสถานะกลุ่มการเข้าถึงแบบมีโครงสร้างได้โดยไม่ต้องขยายกลับเป็นรายการอนุญาตแบบแบน:

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

ผลลัพธ์จะรายงานกลุ่มที่ถูกอ้างอิง จับคู่ได้ ขาดหาย ไม่รองรับ และล้มเหลว ใช้สิ่งนี้เมื่อคุณต้องการการวินิจฉัยหรือการทดสอบความสอดคล้อง ใช้ expandAllowFromWithAccessGroups(...) เฉพาะกับพาธความเข้ากันได้ที่ยังคาดหวังอาร์เรย์ allowFrom แบบแบน

กลุ่มผู้ชมช่องทาง Discord

Discord ยังรองรับประเภทกลุ่มการเข้าถึงแบบไดนามิกด้วย:

json5
{  accessGroups: {    maintainers: {      type: "discord.channelAudience",      guildId: "1456350064065904867",      channelId: "1456744319972282449",      membership: "canViewChannel",    },  },  channels: {    discord: {      dmPolicy: "allowlist",      allowFrom: ["accessGroup:maintainers"],    },  },}

discord.channelAudience หมายถึง "อนุญาตผู้ส่ง DM ของ Discord ที่สามารถดูช่องทางกิลด์นี้ได้ในขณะนี้" OpenClaw จะแก้ผู้ส่งผ่าน Discord ในเวลาที่อนุญาต และใช้กฎสิทธิ์ ViewChannel ของ Discord

ใช้สิ่งนี้เมื่อช่องทาง Discord เป็นแหล่งข้อมูลจริงของทีมอยู่แล้ว เช่น #maintainers หรือ #on-call

ข้อกำหนดและพฤติกรรมเมื่อล้มเหลว:

  • บอตต้องมีสิทธิ์เข้าถึงกิลด์และช่องทาง
  • บอตต้องมี Server Members Intent ใน Discord Developer Portal
  • กลุ่มการเข้าถึงจะล้มเหลวแบบปิดเมื่อ Discord ส่งคืน Missing Access, ไม่สามารถแก้ผู้ส่งเป็นสมาชิกกิลด์ได้ หรือช่องทางเป็นของกิลด์อื่น

ตัวอย่างเฉพาะ Discord เพิ่มเติม: การควบคุมการเข้าถึงของ Discord

หมายเหตุด้านความปลอดภัย

  • กลุ่มการเข้าถึงเป็นนามแฝงของรายการอนุญาต ไม่ใช่บทบาท กลุ่มเหล่านี้ไม่ได้สร้างเจ้าของ อนุมัติคำขอจับคู่ หรือให้สิทธิ์เครื่องมือด้วยตัวเอง
  • dmPolicy: "open" ยังต้องมี "*" ในรายการอนุญาต DM ที่มีผล การอ้างอิงกลุ่มการเข้าถึงไม่เหมือนกับการเข้าถึงสาธารณะ
  • ชื่อกลุ่มที่ขาดหายจะล้มเหลวแบบปิด หาก allowFrom มี accessGroup:operators และไม่มี accessGroups.operators รายการนั้นจะไม่อนุญาตใครเลย
  • รักษา id ของช่องทางให้เสถียร ควรใช้ id แบบตัวเลขหรือ id ผู้ใช้แทนชื่อที่แสดง เมื่อช่องทางรองรับทั้งสองแบบ

การแก้ไขปัญหา

หากผู้ส่งควรถูกจับคู่แต่ถูกบล็อก:

  1. ยืนยันว่าฟิลด์รายการอนุญาตมีการอ้างอิง accessGroup:<name> ที่ตรงกันทุกตัวอักษร
  2. ยืนยันว่า accessGroups.<name>.type ถูกต้อง
  3. ยืนยันว่า id ผู้ส่งถูกระบุไว้ใต้คีย์ช่องทางที่ตรงกัน หรือใต้ "*"
  4. ยืนยันว่ารายการนั้นใช้ไวยากรณ์รายการอนุญาตปกติของช่องทางนั้น
  5. สำหรับกลุ่มผู้ชมช่องทาง Discord ให้ยืนยันว่าบอตมองเห็นช่องทางกิลด์ได้ และเปิดใช้ Server Members Intent แล้ว

เรียกใช้ openclaw doctor หลังจากแก้ไขการกำหนดค่าการควบคุมการเข้าถึง คำสั่งนี้จะตรวจจับชุดค่าผสมของรายการอนุญาตและนโยบายที่ไม่ถูกต้องจำนวนมากก่อนถึงรันไทม์

Was this useful?