1. Filter Chain
Hãy đi sâu vào Filter Chain trong Spring Security. Tôi sẽ giải thích Servlet Filter là gì, vai trò của nó trong Spring Security, và thứ tự các filter quan trọng như Authentication Filter, Authorization Filter, CSRF Filter, v.v.
1. Servlet Filter là gì và vai trò trong Spring Security
a. Servlet Filter là gì?
Định nghĩa:
Servlet Filter là một thành phần trong Java Servlet API, cho phép can thiệp vào quá trình xử lý request và response trước khi chúng đến servlet (hoặc sau khi rời servlet).
Filter hoạt động như một "bộ lọc" trung gian, có thể thực hiện các tác vụ như logging, xác thực, mã hóa, hoặc sửa đổi request/response.
Cách hoạt động:
Các filter được tổ chức thành một Filter Chain (chuỗi bộ lọc). Request đi qua từng filter theo thứ tự, sau đó đến servlet, rồi quay ngược lại qua các filter để xử lý response.
Mỗi filter gọi
chain.doFilter(request, response)
để chuyển request sang filter tiếp theo hoặc servlet.
Ví dụ cơ bản:
b. Vai trò của Filter Chain trong Spring Security
Spring Security dựa trên Filter Chain:
Spring Security triển khai bảo mật thông qua một chuỗi các Servlet Filter, được gọi là Security Filter Chain.
Mỗi filter trong chuỗi đảm nhiệm một nhiệm vụ cụ thể: xác thực (authentication), phân quyền (authorization), bảo vệ CSRF, quản lý session, v.v.
Cơ chế hoạt động:
Khi một request đến, nó đi qua Security Filter Chain. Nếu request không vượt qua được bất kỳ filter nào (ví dụ: chưa đăng nhập), Spring Security sẽ chặn và trả về lỗi (như 401 Unauthorized).
Filter chính trong Spring Security là
FilterChainProxy
, nó quản lý tất cả các filter bảo mật và quyết định chuỗi nào được áp dụng cho request dựa trên URL pattern.
Ví dụ cấu hình cơ bản:
Ở đây,
HttpSecurity
xây dựng một Security Filter Chain với các filter như form login, authorization, v.v.
2. Thứ tự các filter trong Spring Security
Spring Security sử dụng một danh sách các filter tiêu chuẩn, được sắp xếp theo thứ tự cố định để đảm bảo logic bảo mật hoạt động chính xác. Dưới đây là các filter quan trọng và thứ tự mặc định của chúng (có thể thay đổi tùy cấu hình):
Danh sách filter chính và vai trò
SecurityContextPersistenceFilter
:Vai trò: Khôi phục
SecurityContext
từHttpSession
(nếu có) ở đầu chuỗi, và lưu lại sau khi xử lý xong.Ý nghĩa: Đảm bảo thông tin xác thực (authentication) được duy trì giữa các request.
Thứ tự: Đầu tiên.
LogoutFilter
:Vai trò: Xử lý yêu cầu đăng xuất (logout), xóa session và
SecurityContext
.Ý nghĩa: Được kích hoạt khi request khớp với URL logout (mặc định là
/logout
).Thứ tự: Sớm trong chuỗi.
UsernamePasswordAuthenticationFilter
:Vai trò: Xử lý xác thực dựa trên form login (username/password).
Ý nghĩa: Kiểm tra thông tin đăng nhập từ request POST và tạo
Authentication
nếu thành công.Thứ tự: Sau các filter chuẩn bị, trước authorization.
RequestCacheAwareFilter
:Vai trò: Lưu trữ request trước khi redirect (ví dụ: khi yêu cầu đăng nhập), và khôi phục sau khi xác thực xong.
Ý nghĩa: Đảm bảo người dùng quay lại trang mong muốn sau khi đăng nhập.
SecurityContextHolderAwareRequestFilter
:Vai trò: Bọc request để cung cấp thông tin
SecurityContext
cho các thành phần khác.Ý nghĩa: Hỗ trợ tích hợp với các API servlet.
AnonymousAuthenticationFilter
:Vai trò: Gán một
Authentication
ẩn danh (anonymous) cho request nếu chưa xác thực.Ý nghĩa: Đảm bảo mọi request đều có
Authentication
(dù là ẩn danh hay thực).
SessionManagementFilter
:Vai trò: Quản lý session (tạo, kiểm tra session fixation, concurrent sessions).
Ý nghĩa: Bảo vệ session và áp dụng các chính sách như
maximumSessions
.
ExceptionTranslationFilter
:Vai trò: Xử lý ngoại lệ bảo mật (như
AccessDeniedException
,AuthenticationException
) và chuyển hướng đến trang lỗi hoặc login.Ý nghĩa: Đảm bảo phản hồi phù hợp khi có lỗi.
FilterSecurityInterceptor
:Vai trò: Thực hiện phân quyền (authorization) dựa trên cấu hình
authorizeRequests
.Ý nghĩa: Quyết định xem request có được phép truy cập tài nguyên hay không.
Thứ tự: Cuối cùng trong chuỗi xác thực/phân quyền.
CsrfFilter
:Vai trò: Bảo vệ chống tấn công CSRF bằng cách kiểm tra CSRF token trong request (POST, PUT, DELETE).
Ý nghĩa: Chỉ áp dụng cho các request thay đổi dữ liệu.
Thứ tự: Trước
FilterSecurityInterceptor
, sau các filter xác thực.
Thứ tự mặc định (tóm tắt)
Lưu ý:
Thứ tự có thể thay đổi nếu bạn thêm custom filter hoặc dùng các cơ chế khác (như JWT).
Để xem toàn bộ filter chain, bật debug log:
Custom Filter
Bạn có thể thêm filter tùy chỉnh vào chuỗi:
addFilterBefore
,addFilterAfter
,addFilterAt
cho phép chèn filter vào vị trí mong muốn.
Tóm tắt
Servlet Filter: Thành phần trung gian xử lý request/response, nền tảng của Security Filter Chain.
Vai trò trong Spring Security: Quản lý toàn bộ quy trình bảo mật từ xác thực, phân quyền đến bảo vệ session/CSRF.
Thứ tự filter: Được thiết kế để đảm bảo logic bảo mật (xác thực trước, phân quyền sau, xử lý lỗi cuối cùng).
Last updated