config ที่ยังลอยอยู่ในบทความ แต่คอมไพล์ไม่ผ่านแล้ว
บทก่อนจบด้วย SecConfig ที่ทำให้ /open กลับมาใช้ได้ · บทนี้ถามว่าทำไมต้องเขียนแบบนั้น
และทำไมรูปที่คุณจะเจอจากการค้นหา ถึงแปะลงไปแล้วไม่คอมไพล์
probe สร้างโปรเจกต์ Gradle ขึ้นใหม่ทีละทรง แล้วสั่ง :app:compileKotlin อย่างเดียว
· ไม่ได้สตาร์ตแอป ไม่ได้ยิงคำขอ · หน่วยของบทนี้มีสองอย่าง
- ผลการคอมไพล์ ผ่านหรือไม่ผ่าน
- ข้อความที่ compiler พิมพ์ออกมา ยกมาทั้งบรรทัด
ทรงควบคุมชื่อ baseline-sec7 ต้องคอมไพล์ผ่านก่อนเสมอ · ถ้าทรงนั้นไม่ผ่าน probe จะบอกว่า
วัดไม่ได้ แทนที่จะบอกว่าข้ออ้างผิด เพราะการเทียบทุกข้อจะไม่มีความหมาย
รูปที่หนึ่ง · ชื่อ method ที่หายไป
หัวข้อที่มีชื่อว่า “รูปที่หนึ่ง · ชื่อ method ที่หายไป”รูปนี้ถูกต้องมาหลายรุ่น และยังอยู่ในบทความจำนวนมาก
@Beanfun chain(http: HttpSecurity): SecurityFilterChain { http.authorizeRequests { it.anyRequest().authenticated() } return http.build()}e: Unresolved reference 'authorizeRequests'.e: Unresolved reference 'it'.ข้อความที่สองน่าสนใจกว่าข้อความแรก · it ไม่มีตัวตนเพราะ compiler ไม่รู้ชนิดของ lambda
เมื่อ method ที่รับ lambda ไม่มีอยู่ · ข้อผิดพลาดหนึ่งจุดจึงพิมพ์ออกมาสองบรรทัด
รูปที่ใช้ได้คือ authorizeHttpRequestsauthorizeHttpRequestsรูปเดียวที่เหลืออยู่สำหรับประกาศกฎว่าเส้นทางไหนใครเรียกได้ · รุ่น 7 ถอด `authorizeRequests` ออก · วัดแล้วว่า code ที่เรียกชื่อเก่าได้ `Unresolved reference` จาก compiler · ข้างหลังมันคือ AuthorizationFilterAuthorizationFilterfilter ที่ตัดสินว่าคำขอผ่านกฎหรือไม่ · มาแทน `FilterSecurityInterceptor` ของรุ่นก่อน · มันเป็นตัวโยน exception ที่ `ExceptionTranslationFilter` รับต่อ ซึ่งเป็นตัวตัดสินว่าคำขอผ่านกฎหรือไม่ และเป็นตัวโยน exception ที่บทก่อนตามรอยไว้
รูปที่สอง · การต่อประโยคที่หายไปทั้งแบบ
หัวข้อที่มีชื่อว่า “รูปที่สอง · การต่อประโยคที่หายไปทั้งแบบ”รูปนี้เคยเป็นวิธีร้อยหลายเรื่องไว้ในประโยคเดียว
http.authorizeHttpRequests { it.anyRequest().authenticated() } .and() .httpBasic { }e: Unresolved reference. None of the following candidates is applicable because of a receiver type mismatch:e: Unresolved reference 'httpBasic'.and() เคยคืนค่าเป็นตัว HttpSecurity เพื่อให้ต่อเรื่องถัดไปได้ · เมื่อมันหายไป
httpBasic ที่ห้อยอยู่ท้ายสายจึงหาเจ้าของไม่เจอ
รูปที่ใช้ได้คือเรียกทีละเรื่อง เรื่องละบรรทัด แบบที่ SecConfig ในบทก่อนเขียนไว้
รูปที่สาม · import ที่ตายทั้งบรรทัด
หัวข้อที่มีชื่อว่า “รูปที่สาม · import ที่ตายทั้งบรรทัด”รูปนี้ไม่ได้เปลี่ยนชื่อ method มันเปลี่ยนที่อยู่
import org.springframework.security.config.annotation.ObjectPostProcessore: Unresolved reference 'ObjectPostProcessor'.ObjectPostProcessorObjectPostProcessorช่องที่ให้เราแตะ filter ที่ Spring สร้างขึ้นเอง ก่อนมันถูกใช้งาน · **ย้าย package ในรุ่น 7** จาก `config.annotation` มาเป็น `config` · path ของรุ่น 6 ให้ `Unresolved reference` ยังมีอยู่ และยังทำงานเหมือนเดิม · มันแค่ย้าย package
| รุ่น | ที่อยู่ |
|---|---|
| รุ่นก่อน | org.springframework.security.config.annotation.ObjectPostProcessor |
| รุ่นที่เราใช้ | org.springframework.security.config.ObjectPostProcessor |
Unresolved reference ของรูปที่หนึ่ง แปลว่าของนั้นไม่มีแล้ว
· Unresolved reference ของรูปที่สาม แปลว่าของนั้นมีอยู่ แต่คุณชี้ผิดที่
สองอย่างนี้ให้ข้อความเดียวกันเป๊ะ · การอ่านแล้วสรุปว่า “API นี้ถูกถอดออกแล้ว” จึงผิดได้ครึ่งหนึ่งของเวลา · ทางแยกคือเปิดหาชื่อ class ในตัว jar ไม่ใช่เดาจากข้อความ
รอบที่วัดจริงของคอร์สนี้พลาดข้อนี้มาแล้วหนึ่งครั้ง · ร่างแรกของ probe เขียน import ผิด แล้วเกือบบันทึกว่า “ทางนี้ใช้ไม่ได้” ทั้งที่ใช้ได้
รูปที่ผ่าน
หัวข้อที่มีชื่อว่า “รูปที่ผ่าน”สามบรรทัด ไม่มีการต่อประโยค
@Configurationclass SecConfig { @Bean fun chain(http: HttpSecurity): SecurityFilterChain { http.authorizeHttpRequests { it.anyRequest().authenticated() } return http.build() }}SecurityFilterChainSecurityFilterChainรายการ filter ที่คำขอต้องเดินผ่านก่อนถึง `DispatcherServlet` · ประกาศเป็น bean · มีได้หลายตัว และตัวที่ matcher ตรงเป็นตัวแรกคือตัวที่ทำงาน ที่คืนออกไปคือรายการ filter ที่คำขอต้องเดินผ่าน · บทที่ 4 จะกลับมาที่ชนิดนี้อีกครั้ง ตอนที่มีมากกว่าหนึ่งตัว
การคอมไพล์ผ่าน ยังไม่ใช่หลักฐานว่ามันทำงาน
หัวข้อที่มีชื่อว่า “การคอมไพล์ผ่าน ยังไม่ใช่หลักฐานว่ามันทำงาน”นี่คือประโยคที่ทั้งคอร์สแขวนอยู่ และบทที่ 3 จะพิสูจน์มัน
probe ของบทนี้วัดเก้าทรง หกทรงในนั้นคอมไพล์ผ่าน · แต่คำว่าผ่านที่นี่แปลว่า ชื่อที่คุณพิมพ์มีอยู่จริงใน jar เท่านั้น
ในหกทรงที่ผ่าน มีทรงหนึ่งที่บทถัดไปวัดตอนรันแล้วพบว่าไม่มีผลสักช่อง · compiler ไม่มีทางเตือนเรื่องนั้น เพราะมันไม่ใช่เรื่องของชนิดข้อมูล
- ชื่อนี้มีอยู่ไหม ·
compileKotlinตอบได้ - ของชิ้นนี้ถูกเรียกใช้จริงไหม · ต้องสตาร์ตแอปแล้ววัด
config ที่ตอบข้อแรกผ่านแต่ตกข้อสอง คือ config ที่อ่านแล้วดูถูกทุกบรรทัด และไม่ทำอะไรเลย
สิ่งที่บทนี้ทิ้งไว้
หัวข้อที่มีชื่อว่า “สิ่งที่บทนี้ทิ้งไว้”เขียน config เป็นแล้ว ยังไม่รู้ว่าใครเป็นคนเลือกรหัสตอบกลับ
บทก่อนวัดได้ว่าคำขอที่ไม่ส่งรหัสผ่านได้ 401 และคำขอที่สิทธิ์ไม่พอได้ 403
· กฎที่เราเขียนไม่มีบรรทัดไหนพูดถึงตัวเลขสองตัวนั้นเลย · บทถัดไปหาว่าใครเป็นคนเลือก
- Spring Boot 4.1.1 · Spring Security 7.1.1 · Kotlin 2.4.10 · JDK 25
- รันซ้ำเองได้ด้วย
npm run verify:clinic-security-shapesซึ่งคอมไพล์เก้าทรง แล้วเทียบผลทีละทรง · ไม่ต้องใช้ Docker และไม่ต้องใช้ฐานข้อมูล - ข้อความ compiler ทุกบรรทัดในบทนี้ถูกตรึงไว้ที่
src/data/perf/clinic-security-shapes.tsและtest/course-clinic-security.test.tsผูกข้อความในบทเข้ากับ file นั้น - Spring Security — What’s New in 7.0 (เข้าถึง 2026-09-02) — รายการสิ่งที่ถูกถอดออกจาก DSL
เช็กความเข้าใจ — บทที่ 2
ข้อ 1 / 3ทำไมรูปที่ใช้ `authorizeRequests` ถึงพิมพ์ข้อผิดพลาดออกมาสองบรรทัด ทั้งที่เขียนผิดจุดเดียว