Chuyên mục

Backend

APIs, databases and distributed systems.

99 Ngày Spring — Ngày 47: Phân quyền — role & authority

Role chỉ là authority có tiền tố ROLE_, vì sao hasRole("ROLE_ADMIN") luôn cho 403, thiết kế role gom quyền để thêm vai trò không phải sửa code — và hai thứ im lặng làm hỏng method security.

12 thg 9, 20267 phút11
99 Ngày Java — Ngày 47: Serialization & JSON

Vì sao Serializable của Java bị cả ngành rời bỏ, ObjectMapper tạo một lần dùng mãi, bẫy TypeReference khi đọc List do xóa kiểu — và vì sao record hợp với JSON tới mức không cần annotation nào.

12 thg 9, 20267 phút6
99 Ngày Spring — Ngày 46: Refresh token & logout

Access token 15 phút cộng refresh token 7 ngày lưu database, vì sao refresh token không nên là JWT, rotation biến việc dùng lại token thành chuông báo động — và sự thật rằng đăng xuất của JWT là "không cấp thêm".

11 thg 9, 20268 phút14
99 Ngày Java — Ngày 46: NIO.2 — Path & Files

Path là một cái tên chứ không phải một file, resolve và normalize cùng bẫy path traversal, Files ném ngoại lệ có tên thay vì trả false, ATOMIC_MOVE để ghi file an toàn — và walk, find, glob thay hẳn đệ quy tự viết.

11 thg 9, 20267 phút7
99 Ngày Spring — Ngày 45: JWT — filter xác thực

OncePerRequestFilter đọc header Bearer và đặt SecurityContext, lắp trước UsernamePasswordAuthenticationFilter cùng cấu hình STATELESS, khi nào tắt CSRF là hợp lệ — và refresh token lưu DB để lấy lại khả năng thu hồi.

10 thg 9, 20267 phút12
99 Ngày Java — Ngày 45: File I/O với java.io

Hai họ stream cho byte và reader cho ký tự, buffered biến một triệu syscall thành hơn trăm, bẫy charset mặc định làm vỡ tiếng Việt — và đọc file lớn bằng Files.lines thay vì nạp hết vào RAM.

10 thg 9, 20267 phút9
99 Ngày Spring — Ngày 44: JWT — phát hành token

Cấu trúc ba phần của JWT và vì sao payload không hề được mã hóa, ký token bằng khóa bí mật đủ dài, endpoint đăng nhập dùng lại AuthenticationManager — cùng đánh đổi lớn nhất: không thu hồi được.

9 thg 9, 20267 phút15
99 Ngày Java — Ngày 44: try-with-resources

Vì sao finally viết tay vừa dài vừa sai, cú pháp nhiều tài nguyên đóng theo thứ tự ngược, suppressed exception giữ lại lỗi gốc — và bẫy quên đóng stream của Files.walk.

9 thg 9, 20267 phút9
99 Ngày Spring — Ngày 43: User từ database

UserDetailsService chỉ đòi một method, luồng đăng nhập qua DaoAuthenticationProvider và PasswordEncoder, entity người dùng cùng chuyện tiền tố ROLE_ — và bốn cái bẫy, mở đầu là thông báo lỗi tiết lộ quá nhiều.

8 thg 9, 20267 phút14