ดูแลองค์กร
Role, binding และ explain
system role เทมเพลต การผูกกับคนหรือโครงสร้าง และวิธีคำนวณสิทธิ์ที่มีผล
สิทธิ์ใน Pi Auth มีสามชั้น: แอปประกาศ permission ผู้ดูแลจัดกลุ่มเป็น role แล้ว role ถูกผูกกับไดเรกทอรี สิทธิ์ที่มีผลของสมาชิกคือผลรวมของ binding เหล่านั้น ณ ตอนนี้ — คำนวณสด cache สั้น ๆ และอธิบายที่มาได้เสมอ
Role
| ชนิด | มาจากไหน | หมายเหตุ |
|---|---|---|
| System role | ทุก tenant โดยอัตโนมัติ | เจ้าของ tenant และ ผู้ดูแล tenant มีสิทธิ์ในตัว tenant:admin, directory:read/write, access:read/write; สมาชิก มี directory:read ตาม base role ของ membership แก้หรือลบไม่ได้ |
| เทมเพลต role | manifest ของแอป ตอนติดตั้งแอป | role สำเร็จรูปเช่น “ผู้ดูแล Pi PDF” แก้ได้ตามใจ — เป็นสำเนาของ tenant |
| Role ที่สร้างเอง | สิทธิ์ → Roles → สร้าง role | permission ชุดใดก็ได้จากแอปที่ติดตั้ง role หนึ่งรวม permission หลายแอปได้ |
permission ที่แอปทำเครื่องหมาย HIGH ถูกเน้นในตัวแก้ role permission ที่ deprecated (ถูกเอาออกจาก manifest ใหม่) ยังอยู่ใน role เดิมแบบขีดฆ่าจนกว่าจะมีคนเอาออก
Binding
binding เชื่อม role กับ subject เปิด role แล้วกด ผูก:
| Subject | ใครได้ role |
|---|---|
| สมาชิกรายคน | เฉพาะคนนั้น เหมาะกับข้อยกเว้น ส่วนกติกาให้ใช้ binding เชิงโครงสร้าง |
| กลุ่ม | ทุกคนในกลุ่ม ตามที่สมาชิกกลุ่มเปลี่ยน |
| ตำแหน่ง | ทุกคนที่ถือตำแหน่งนั้นไม่ว่าอยู่ตรงไหนของผัง — รวมผู้รักษาการ |
| หน่วยงาน | ทุกคนที่สังกัดหลักคือหน่วยนั้น; ถ้าเลือกรวมหน่วยย่อย คือทุกคนในต้นไม้ใต้มัน หน่วยใหม่ที่สร้างใต้มันได้รับต่อโดยอัตโนมัติ |
binding มีช่วงเวลามีผล (จาก / ถึง) ได้ สิทธิ์ชั่วคราว — ตรวจสอบ โครงการ รักษาการ — หมดไปเอง และแสดงเป็นหมดอายุในหน้า role แทนที่จะค้างเงียบ ๆ
สิทธิ์ที่มีผลคำนวณอย่างไร
รวบรวม subject ของสมาชิก
membership, กลุ่ม, ตำแหน่งหลักและตำแหน่งที่ได้รับมอบหมาย, หน่วยงานหลักและบรรพบุรุษทั้งหมด
หา binding ที่ตรง
binding ที่มีผล (อยู่ในช่วงเวลา) ซึ่ง subject เป็นหนึ่งในนั้น บวก system role ของ base role
รวม permission ของ role ทั้งหมด
ตัด permission ที่ deprecated และของแอปที่ถอนแล้ว ผลลัพธ์ตัดซ้ำและเรียงลำดับ
cache 5 นาที
การเปลี่ยน binding, role, ผังองค์กร, กลุ่ม หรือ membership ล้าง cache ของ tenant ทันที — 5 นาทีมีผลเฉพาะเมื่อไม่มีอะไรเปลี่ยน
โทเค็นมีสิทธิ์ของแอปที่ระบุใน resource เท่านั้น สมาชิกที่มีสิทธิ์ในห้าแอปจะได้เฉพาะชุดที่เกี่ยวในโทเค็นของแต่ละแอป
Explain
สิทธิ์ → ตรวจสิทธิ์ (explain) รับสมาชิก (และแอปถ้าต้องการ) แล้วแสดงทุกสิทธิ์ที่มีผลพร้อมสายที่มา: role ไหน ผูกกับ subject ใด ถึงผ่านหน่วยงานหรือตำแหน่งใด ใช้เมื่อมีคนถามว่า “ทำไมฉันถึงทำ/ไม่ทำสิ่งนี้ได้?” — คำตอบคือ binding ที่ต้องแก้ ไม่ใช่โค้ด
ตรวจสิทธิ์ในแอป
const user = await piAuth.getCurrentUser();
if (!user?.perms.includes("memo:approve")) return forbidden();
// หรือ
piAuth.requirePermission(user, "memo:approve"); // throw 403 problemตรวจ permission ไม่ใช่ base role หรือตำแหน่ง: trole === "admin" พังทันทีที่องค์กรอยากให้คนที่ไม่ใช่ admin อนุมัติ ส่วน memo:approve ให้เขาผูกกับใครก็ได้
ให้ผู้ใช้ขอสิทธิ์จากในแอป
คนที่เข้าแอปได้แต่ยังไม่มี permission ไม่ต้องไปตามหาผู้ดูแลเอง — วางปุ่ม <RequestAccessButton clientId={process.env.NEXT_PUBLIC_PI_AUTH_CLIENT_ID!} /> จาก @suphark/auth-ui (≥ 0.3.0) หรือลิงก์ไป https://auth.suphark.com/request-access?client_id=<clientId> (แอปที่ไม่ใช้ React)
- ผู้ใช้พิมพ์ข้อความถึงผู้ดูแล (ไม่บังคับ) แล้วส่ง — คำขอเข้าองค์กรที่ผู้ใช้เลือกอยู่ที่ Pi Auth
- ผู้ดูแลได้อีเมล แล้วเลือก role ของแอปตอนกดอนุมัติที่ คน › คำขอเข้าใช้และสิทธิ์ (หรือหน้า ผู้ใช้ ของแอป)
- ผู้ใช้ได้อีเมลแจ้ง สิทธิ์มีผลทันที (แอปได้ event
role.binding.changed)
แอปโหมด “รออนุมัติ” ใช้หน้าจอเดียวกัน — คำขอเข้าใช้ครั้งแรกก็เลือก role ตอนอนุมัติได้เช่นกัน