Learning Outcome & Exercises: Spring Security
Tổng kết chương Spring Security: học xong mình phải làm được gì, và làm bài tập nào để chứng minh?
Đọc hiểu chưa đủ để đi phỏng vấn. Mỗi chương kết thúc bằng những việc làm được và chứng minh được: có code chạy, có test cho cả trường hợp lỗi, có log hoặc số đo. Bài tập nằm trong repo riêng java-backend-interview-labs, thư mục labs/spring-security.
1. Mục tiêu đầu ra
Học xong chương này, bạn tự làm được:
- Cấu hình SecurityFilterChain stateless với JWT và giải thích thứ tự filter.
- Viết integration test cho 401 (thiếu token), 403 (thiếu quyền) và 200.
- Phân biệt authentication và authorization, role và authority.
2. Basic: Filter chain
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
In danh sách filter đang chạy, bảo vệ /api/** và mở /actuator/health.
Bài liên quan: Filter chain, Authentication flow
Hoàn thành khi:
- Test 401 và 200
3. Intermediate: JWT resource server
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Xác thực JWT ký HS256/RS256 (key qua biến môi trường), @PreAuthorize theo scope.
Bài liên quan: JWT, Access & refresh token, Authorization
Hoàn thành khi:
- Test 401/403/200
- Không có secret trong repo
4. Challenge: Method security & Keycloak
Trạng thái: ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành
Dùng Keycloak realm của lab keycloak làm issuer; test bằng jwt() của spring-security-test và một test end-to-end với token thật.
Bài liên quan: Resource Server & Keycloak, Method security & test, Password, CORS, CSRF
Hoàn thành khi:
- Ghi rõ phần nào cần Docker
- Evidence token decode (đã che chữ ký)
5. Tiêu chí hoàn thành chung
- Tự giải thích được bài toán và vì sao chọn giải pháp.
- Code chạy được bằng lệnh ghi trong README, không chứa secret.
- Có test tự động cho happy path và failure path.
- Có log hoặc số đo trong
evidence/chứng minh kết quả. - Có câu trả lời phỏng vấn ngắn bằng tiếng Việt và tiếng Anh.
- README của lab có link ngược về bài học tương ứng.
6. Lab và trạng thái
| Mức | Bài tập | Trạng thái | Test / bằng chứng |
|---|---|---|---|
| Basic | Filter chain | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Intermediate | JWT resource server | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
| Challenge | Method security & Keycloak | ⬜ Chưa triển khai: chưa có code/test, chưa tính là hoàn thành | — |
Repo lab: java-backend-interview-labs/labs/spring-security. TODO: link GitHub là placeholder cho tới khi repo được push.
evidence/; chỉ đánh dấu xong khi có bằng chứng.Phỏng vấn hỏi về Spring Security, câu nào hay gặp nhất và trả lời sao?
Q1. 401 và 403 khác nhau thế nào?
🇻🇳 Tiếng Việt:
401 là chưa xác thực được: thiếu hoặc sai token. 403 là đã biết bạn là ai nhưng bạn không có quyền với tài nguyên này.
🇬🇧 English:
401 means the request is not authenticated: the token is missing or invalid. 403 means we know who you are but you are not allowed to access this resource.
Cách nhớ ngắn gọn
- Mỗi bài tập = code + test + log.
- Luôn có ít nhất một failure case.
- Chưa có bằng chứng thì chưa xong.
Tự kiểm tra
Bài tập Basic (Filter chain) được coi là xong khi nào?
Test 401 và 200. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Intermediate (JWT resource server) được coi là xong khi nào?
Test 401/403/200; Không có secret trong repo. Chưa có code chạy và bằng chứng thì chưa tính là xong.
Bài tập Challenge (Method security & Keycloak) được coi là xong khi nào?
Ghi rõ phần nào cần Docker; Evidence token decode (đã che chữ ký). Chưa có code chạy và bằng chứng thì chưa tính là xong.