ข้าม​ไป​ยัง​เนื้อหา

สัญญา​ของ​ทาง​เข้า ที่​มี​หนึ่ง​แถว​ซึ่ง​ระบบ​ยัง​ทำ​ไม่​ได้

ตัวเลข​ที่​กระจาย​อยู่​คนละ​บท ไม่ใช่​สัญญา · มัน​กลาย​เป็น​สัญญา​เมื่อ​เขียน​รวม​กัน​ใน​ที่​เดียว แล้ว​มี​เทสต์​ที่​แดง​ได้​จริง​คอย​เฝ้า

ผู้​เรียก​แต่ละ​แบบ เรียก​อะไร​ได้ ได้​รหัส​อะไร มี body กี่​คีย์ และ​เห็น​กี่​แถว

ผู้​เรียกปลาย​ทางรหัสคีย์​ใน bodyแถว
ยัง​ไม่​ยืนยัน​ตัวGET /open2001—
ยัง​ไม่​ยืนยัน​ตัวGET /admin4015—
รหัส​ผ่าน​ผิดGET /admin4015—
ยืนยัน​ตัว​แล้ว สิทธิ์​ไม่​พอGET /admin4035—
ยืนยัน​ตัว​แล้ว สังกัด clinic-aGET /visits20022

แถว​สุดท้าย​ของ​ตาราง​นี้​ตอบ​คำถาม​ครึ่ง​หลัง​ของ​ชื่อ​คอร์ส · ฐาน​ข้อมูล​มี​คนไข้​สาม​แถว ผู้​เรียก​คน​นี้​เห็น​สอง​แถว

สัญญา​ที่​ไม่มี​ใคร​บังคับ คือ​คำ​อธิบาย​ที่​จะ​ค่อยๆ กลาย​เป็น​เท็จ

หลัก​ประกันผู้​บังคับบท​ที่
ใคร​เรียก​ปลาย​ทาง​ไหน​ได้authorizeHttpRequests ใน chain2
คน​ที่​ไม่​ผ่าน​ได้​รหัส​อะไรAuthenticationTrustResolver3
chain ตัว​ไหน​รับคำ​ขอลำดับ​ของ @Order ที่ runtime ตรวจ​ให้4
คำ​ตอบ​ที่​ปฏิเสธ​มี bodyAuthenticationEntryPoint และ AccessDeniedHandlerAccessDeniedHandlerตัว​ที่​เขียน​คำ​ตอบ​ให้​ผู้​เรียก​ที่​ยืนยัน​ตัว​แล้ว​แต่​ไม่มี​สิทธิ์ · คู่​กับ​ตัว​บน​คือ​สอง​ที่​ที่​ต้อง​เขียน​เอง ถ้า​อยาก​ให้ body ของ security กลับ​เข้า​สัญญา​เดิม5
กฎ​อ้าง​สิทธิ์​ที่​มี​อยู่​จริงรายการ​ใน Authentication6
ผู้​เรียก​เห็น​แถว​ของ​ตัว​เองเงื่อนไข​ใน query7

หลัก​ประกัน​หก​ข้อ​ถูก​บังคับ​จาก​หก​ที่ ไม่มี​ที่​เดียว​ที่​เห็น​ครบ​ทุก​ข้อ · access contractaccess contractตาราง​ที่​บอก​ว่า​ผู้​เรียก​แต่ละ​แบบ​เรียก​อะไร​ได้ ได้​รหัส​อะไร​กลับ และ​เห็น​กี่​แถว · เป็น​สัญญา​ก็​ต่อ​เมื่อ​มี​เทสต์​ที่​แดง​ได้​จริง​เมื่อ​ช่อง​ใด​ช่อง​หนึ่ง​เปลี่ยน จึง​ต้อง​เขียน เป็น​ตาราง ไม่ใช่​ฝาก​ไว้​กับ​ความ​จำ​ของ​คน​ที่​เขียน config

คอร์ส​จบ​ด้วย​การ​บอก​ว่า​อะไร​ยัง​ไม่​เสร็จ ไม่ใช่​ด้วย​การ​บอก​ว่า​เสร็จ​แล้ว

บท​ที่ 7 วัด​ได้​ว่า​ปลาย​ทาง​ที่​กัน​ด้วย​กฎ​ระดับ method คืน 500 ไม่ใช่ 403 · ถ้า​เขียน​ลง​ตาราง​ตาม​ที่​วัด​ได้​ตรงๆ แถว​นั้น​จะ​เป็น​แบบ​นี้

ผู้​เรียกปลาย​ทางรหัส​ที่ควรได้รหัส​ที่ได้​จริง
ยืนยัน​ตัว​แล้ว สิทธิ์​ไม่​พอGET /guarded403500

ช่อง​ขวา​สุด​คือ​หนี้​ที่​คอร์ส​นี้​เปิด​ทิ้ง​ไว้​โดย​ตั้งใจ · ทาง​แก้​มี​สอง​ทาง

  • เพิ่ม handler ของ AuthorizationDeniedException ลงใน advice ตัว​เดิม ให้​ตอบ 403 แทน handler ของ Exception
  • ใช้ @HandleAuthorizationDenied@HandleAuthorizationDeniedการ​เปลี่ยน​การ​ปฏิเสธ​จาก​การ​โยน exception เป็นการ​คืน​ค่า​แทน · เปลี่ยน​คำ​ตอบ​จาก​รหัส​ข้อ​ผิด​พลาด เป็น​คำ​ตอบ​ที่​สำเร็จ​แต่​ไม่มี​ข้อมูล​ข้าง​ใน เปลี่ยน​การ​ปฏิเสธ​จาก​การ​โยน เป็นการ​คืน​ค่าที่​ว่าง​เปล่า
ตาราง​ที่​ทุก​ช่อง​เขียว​คือ​ตาราง​ที่​น่า​สงสัย

ถ้า​สัญญา​ที่​คุณ​เขียน​ไม่มี​แถว​ไหน​แดง​เลย ให้​ถาม​ว่า​มัน​ถูก​เขียน​หลัง​จาก​ดู​ผลลัพธ์​แล้ว​หรือ​เปล่า

สัญญา​ที่​ดี​เขียน​จาก​สิ่ง​ที่ควรเป็น แล้ว​ปล่อย​ให้การ​วัด​ชี้​ว่า​ช่อง​ไหน​ยัง​ไม่​ถึง

ผูก​ตัว​หนังสือ​ใน​บท​เรียน เข้า​กับ​ค่าที่ probe วัด​ได้ ที​ละ​ช่อง

ทุก​ตัวเลข​ใน​หน้า​นี้​ถูก​เทียบ​กับ src/data/perf/clinic-security.ts ซึ่ง probe สร้าง​ใหม่ จาก Spring Boot ตัว​จริง · เปลี่ยน​ตัวเลข​ใน​ตาราง​โดย​ไม่​วัด​ใหม่ แล้ว​เทสต์​แดง​ทันที

นั่น​คือ​ความ​ต่าง​ระหว่าง​ตาราง​ที่​เป็น​สัญญา กับ​ตาราง​ที่​เป็น​ภาพ​ประกอบ

ขอบเขต​ที่​ประกาศ​ไว้​ตั้งแต่​ต้น และ​ไม่​ได้​ขยาย​ระหว่าง​ทาง

  • OAuth2 กับ OIDC ทั้ง​ระบบ · คอร์ส​นี้​ใช้​การ​ยืนยัน​ตัว​แบบ​ง่าย​ที่สุด เพื่อ​ให้​คำถาม​อยู่​ที่​กลไก ไม่ใช่​ที่​การ​ตั้ง​ค่า
  • หน้า login · ทุก​อย่าง​วัด​จาก​ฝั่ง​ผู้​เรียก​ที่​เป็น​ตัว API
  • CSRF กับ CORS · เป็น​คนละ​คำถาม และ​จะ​ทำให้​แปดบท​ไม่​พอ
  • การ​เข้า​รหัส​รหัส​ผ่าน · เป็น​เรื่อง​ของ​คอร์ส security ทั่วไป ไม่ใช่​ของ​ทาง​เข้า​นี้
  • ความเร็ว · ทั้ง​คอร์ส​ไม่มี​หน่วย​เวลา​สัก​ตัว โดย​ตั้งใจ

คอร์ส​นี้​เริ่ม​ด้วย​คำถาม​สอง​ข้อ และ​ตอบ​ทั้ง​สอง​ข้อ​ด้วย​ตัวเลข

ใคร​เรียก​ได้ · ตอบ​ด้วย​รหัส 401 กับ 403 และ​กลไก​ที่​เลือก​ระหว่าง​สอง​ตัว​นั้น

เห็น​ข้อมูล​ของ​ใคร · ตอบ​ด้วย​จำนวน​แถว ซึ่ง​เป็น​หน่วย​เดียว​ที่​จับ​การ​รั่ว​ชนิด​นี้​ได้ เพราะ​คำขอ​ที่​รั่ว​นั้น​สำเร็จ​ทุก​ครั้ง

ที่มา​ของ​ตัวเลข​ใน​บท​นี้
  • Spring Boot 4.1.1 · Spring Security 7.1.1 · Kotlin 2.4.10 · JDK 25 · PostgreSQL 18
  • รัน​ซ้ำ​เอง​ได้​ด้วย npm run verify:clinic-security · ต้อง​สั่ง scripts/clinic-security/up.sh ก่อน เพราะ​แถว​สุดท้าย​ของ​ตาราง​ต้อง​ใช้​ฐาน​ข้อมูล​จริง
  • ทุก​ช่อง​ใน​สอง​ตาราง​ถูก​ตรึง​ไว้​ที่ src/data/perf/clinic-security.ts และ test/course-clinic-security.test.ts ผูก​ตัวเลข​ใน​บท​เข้า​กับ file นั้น

เช็กความเข้าใจ — บทที่ 8

ข้อ 1 / 3

ทำไมสัญญาของทางเข้าถึงต้องเขียนเป็นตาราง แทนที่จะอธิบายเป็นความ