Configuration
กลุ่มการเข้าถึง
กลุ่มการเข้าถึงคือรายการผู้ส่งที่ตั้งชื่อไว้ ซึ่งคุณกำหนดครั้งเดียวแล้วอ้างอิงจากรายการอนุญาตของช่องทางด้วย accessGroup:<name>
ใช้เมื่อควรอนุญาตให้คนกลุ่มเดียวกันเข้าถึงได้ในหลายช่องทางข้อความ หรือเมื่อชุดผู้ที่เชื่อถือได้ชุดหนึ่งควรใช้กับทั้งการอนุญาตผู้ส่งใน DM และในกลุ่ม
กลุ่มการเข้าถึงไม่ได้ให้สิทธิ์เข้าถึงด้วยตัวเอง กลุ่มจะมีผลก็ต่อเมื่อฟิลด์รายการอนุญาตอ้างอิงถึงกลุ่มนั้น
กลุ่มผู้ส่งข้อความแบบคงที่
กลุ่มผู้ส่งแบบคงที่ใช้ type: "message.senders"
{ 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:
{ 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"], }, },}พาธของช่องทางข้อความที่รองรับ
กลุ่มการเข้าถึงพร้อมใช้งานในพาธการอนุญาตของช่องทางข้อความที่ใช้ร่วมกัน รวมถึง:
- รายการอนุญาตผู้ส่ง 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 สามารถตรวจสอบสถานะกลุ่มการเข้าถึงแบบมีโครงสร้างได้โดยไม่ต้องขยายกลับเป็นรายการอนุญาตแบบแบน:
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 หมายถึง "อนุญาตผู้ส่ง 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 ผู้ใช้แทนชื่อที่แสดง เมื่อช่องทางรองรับทั้งสองแบบ
การแก้ไขปัญหา
หากผู้ส่งควรถูกจับคู่แต่ถูกบล็อก:
- ยืนยันว่าฟิลด์รายการอนุญาตมีการอ้างอิง
accessGroup:<name>ที่ตรงกันทุกตัวอักษร - ยืนยันว่า
accessGroups.<name>.typeถูกต้อง - ยืนยันว่า id ผู้ส่งถูกระบุไว้ใต้คีย์ช่องทางที่ตรงกัน หรือใต้
"*" - ยืนยันว่ารายการนั้นใช้ไวยากรณ์รายการอนุญาตปกติของช่องทางนั้น
- สำหรับกลุ่มผู้ชมช่องทาง Discord ให้ยืนยันว่าบอตมองเห็นช่องทางกิลด์ได้ และเปิดใช้ Server Members Intent แล้ว
เรียกใช้ openclaw doctor หลังจากแก้ไขการกำหนดค่าการควบคุมการเข้าถึง คำสั่งนี้จะตรวจจับชุดค่าผสมของรายการอนุญาตและนโยบายที่ไม่ถูกต้องจำนวนมากก่อนถึงรันไทม์