Người Gác Cổng Tin Cậy

Phần này giới thiệu các khái niệm cốt lõi của Spring Security. Bạn sẽ hiểu được Spring Security là gì, vai trò của nó trong các ứng dụng hiện đại, và phân biệt rõ hai trụ cột của bảo mật: Xác thực (Authentication) và Phân quyền (Authorization).

Authentication (Xác thực)

"Bạn là ai?"

Là quá trình xác minh danh tính của người dùng. Spring Security kiểm tra thông tin đăng nhập (như username/password, token, OTP) để đảm bảo người dùng là thật và hợp lệ trước khi cho phép họ vào hệ thống.

Authorization (Phân quyền)

"Bạn được làm gì?"

Sau khi đã xác thực, đây là quá trình quyết định các quyền hạn của người dùng. Spring Security xác định xem người dùng có được phép truy cập một tài nguyên cụ thể hay thực hiện một hành động nào đó hay không (ví dụ: chỉ `ADMIN` mới được xóa sản phẩm).

Session-based vs. Token-based (JWT)

Hai phương pháp xác thực phổ biến với những đặc điểm riêng, phù hợp cho các kiến trúc ứng dụng khác nhau. Biểu đồ dưới đây so sánh chúng dựa trên các tiêu chí quan trọng.

Kiến Trúc Cốt Lõi

Khám phá cách các thành phần chính của Spring Security phối hợp với nhau để bảo vệ ứng dụng của bạn. Nhấp vào từng khối trong sơ đồ để xem chi tiết vai trò của chúng trong luồng xử lý yêu cầu.

HTTP Request
SecurityFilterChain
AuthenticationManager
Controller/Resource

Nhấp vào một thành phần trong sơ đồ để xem mô tả chi tiết.

Các Phương Thức Xác Thực

Spring Security hỗ trợ nhiều cơ chế xác thực. Hãy cùng tìm hiểu về các phương thức phổ biến, từ Form Login truyền thống đến JWT hiện đại cho microservices.

Phân Quyền Chi Tiết

Bảo mật ở cấp độ phương thức với các annotation mạnh mẽ và Ngôn ngữ Biểu thức Spring (SpEL). Đây là cách bạn kiểm soát ai có thể làm gì ở mức độ chi tiết nhất.

@PreAuthorize

Kiểm tra quyền trước khi thực thi phương thức. Rất linh hoạt với SpEL.

@PreAuthorize("hasRole('ADMIN')")

@PostAuthorize

Kiểm tra quyền sau khi phương thức thực thi, dựa trên kết quả trả về.

@PostAuthorize("returnObject.owner == authentication.name")

@Secured

Một cách đơn giản để yêu cầu các vai trò cụ thể. Không hỗ trợ SpEL.

@Secured({"ROLE_USER", "ROLE_ADMIN"})

@RolesAllowed

Tương tự @Secured, là một phần của tiêu chuẩn JSR-250.

@RolesAllowed("ADMIN")

Case Study: Hệ Thống Đặt Món Ăn

Áp dụng các khái niệm đã học vào một kiến trúc microservices thực tế. Sơ đồ này minh họa luồng xác thực và phân quyền sử dụng API Gateway và JWT, một mô hình phổ biến và hiệu quả.

📱

Client (SPA/Mobile)

🛡️

API Gateway

Xác thực JWT

🔑

Auth Service

Phát hành Token

🍔

Order Service

Phân quyền chi tiết

Trong mô hình này, API Gateway đóng vai trò là lớp bảo vệ đầu tiên, xác thực tất cả các yêu cầu đến. Chỉ những yêu cầu hợp lệ mới được chuyển tiếp đến các microservice nghiệp vụ, giúp giảm tải và tăng cường bảo mật cho toàn hệ thống.

Thực Tiễn Tốt Nhất

Một danh sách các khuyến nghị quan trọng để xây dựng một ứng dụng không chỉ mạnh mẽ mà còn thực sự an toàn.

Luôn mã hóa mật khẩu

Sử dụng `BCryptPasswordEncoder` hoặc các thuật toán mạnh tương đương. Không bao giờ lưu mật khẩu dạng văn bản thô.

Sử dụng HTTPS

Bảo vệ dữ liệu trên đường truyền, đặc biệt là khi gửi token hoặc thông tin đăng nhập.

JWT: Thời gian sống ngắn & Refresh Token

Giảm thiểu rủi ro nếu Access Token bị lộ. Lưu Refresh Token an toàn (ví dụ: HttpOnly cookie).

Nguyên tắc đặc quyền tối thiểu

Chỉ cấp cho người dùng những quyền hạn thực sự cần thiết để thực hiện công việc của họ.

Bảo vệ chống CSRF và XSS

Bật bảo vệ CSRF cho ứng dụng stateful. Luôn xác thực đầu vào và mã hóa đầu ra để chống XSS.