Bảo vệ ứng dụng Spring Boot
springboot được dùng để bảo vệ ứng dụng Spring Boot, có thể xử lý BOOT-INF/classes, BOOT-INF/lib, Spring Boot Loader và việc quét các framework.
1. Thao tác qua giao diện GUI
-
Chọn Spring Boot trên trang loại ứng dụng.

-
Chọn ứng dụng Spring Boot cần bảo vệ, Phiên bản Java đi kèm và nền tảng đích, sau đó chọn chế độ đơn giản hoặc chế độ nâng cao.

-
Khi sử dụng chế độ nâng cao, hãy chọn cấu hình đầu ra, các JAR phụ thuộc cần bảo vệ, JavaFX, tham số JVM và quy tắc loại trừ tùy theo nhu cầu; chế độ đơn giản sẽ tự động đề xuất cấu hình đầu ra và các mục cần loại trừ dựa trên kết quả quét tương thích. Ý nghĩa của từng tùy chọn được giải thích trong Cài đặt chế độ nâng cao của Protector4J.

-
Chọn thư mục đầu ra, kiểm tra tóm tắt các tham số, sau đó nhấn Run protection.

2. Ví dụ sử dụng CLI
Lệnh tối thiểu:
p4j springboot app.jar dist
Sử dụng bố cục mặc định là p4jx-fat. Chọn bố cục khác một cách rõ ràng:
p4j springboot app.jar dist --layout fat
p4j springboot app.jar dist --layout separate
Bảo vệ có chọn lọc:
p4j springboot app.jar dist \
--protect 'com.example.service.impl.**' \
--exclude 'com.example.dto.**,com.example.config.**'
3. Cấu trúc và bố cục đầu ra
p4jx-fat: Mặc định, lưu trữ một ứng dụng được bảo vệ duy nhất
dist/
├── app.p4jx # Khi dùng hậu tố jar, tên tệp sẽ là app.jar
├── vlxjre/
├── run.sh
├── run.command
└── run.bat
Đặc điểm:
- Được cung cấp dưới dạng lưu trữ từ một ứng dụng P4JX duy nhất;
- Các tệp vật lý mặc định không phải dạng ZIP;
- Các tài nguyên Spring Boot, phụ thuộc nhúng và metadata được cung cấp thông qua giao diện JAR ảo;
- Có mức độ bảo vệ cao nhất, phù hợp với các ứng dụng không có phụ thuộc vào bộ quét classpath của bên thứ ba.
fat: Cấu trúc tương thích với Spring Boot
dist/
├── app.jar
├── app.p4jx # Khi dùng hậu tố jar, tên tệp sẽ là app-protected.jar
├── vlxjre/
└── run.*
Đặc điểm:
app.jargiữ nguyên cấu trúc vật lý tiêu chuẩn củaBOOT-INF;- Phiên bản thực sự của lớp được bảo vệ nằm trong tập tin P4JX kế bên;
- Phù hợp với các ứng dụng yêu cầu quét cấu trúc JAR vật lý của Spring Boot như ClassGraph, Reflections, v.v.;
- Hai tập tin này có mối liên kết chặt chẽ, cần được cập nhật và giao hàng cùng nhau.
separate:Bố cục tách biệt tương thích
dist/
├── plain-launcher.jar
├── app.p4jx
├── lib/
├── vlxjre/
└── run.*
Đặc điểm:
- Tách Spring Boot Loader, các lớp công khai và phụ thuộc ra khỏi nhau;
- Phù hợp với các môi trường tích hợp cũ yêu cầu đường dẫn lớp dạng phẳng
lib/*; - Các lớp cần được bảo vệ sẽ được trình khởi tạo được tạo ra tải sẵn trước;
- Các dự án mới nên ưu tiên sử dụng
p4jx-fathoặcfatđược máy quét đề xuất.
Cách chọn bố cục
| Các tình huống sử dụng | Cách bố trí được khuyến nghị |
|---|---|
| Dịch vụ Spring Boot thông thường | p4jx-fat |
| Ứng dụng thực tế gọi các công cụ quét như ClassGraph, Reflections, v.v. | fat |
| Khi cần sử dụng thư mục phụ thuộc bên ngoài dạng phẳng, hoặc cần mã hóa riêng các tệp phụ thuộc | separate |
| Chưa chắc chắn | Hãy thực thi --compat-scan trước |
ZIP overlay chỉ hỗ trợ các công cụ đọc trực tiếp thư mục trung tâm của ZIP, không thể thay thế cấu trúc Spring Boot vật lý cần thiết cho các công cụ quét ClassLoader/classpath.
4. Khởi động
./run.sh --spring.profiles.active=prod
Windows:
run.bat --spring.profiles.active=prod
Đừng sử dụng JRE của hệ thống thay thế cho vlxjre trong thư mục đầu ra.
Các tham số khởi động JVM
Khi đóng gói, có thể cố định các tham số JVM thông qua JVM startup options trong giao diện GUI (một tham số mỗi dòng) hoặc qua CLI:
p4j springboot app.jar dist \
--jvm-option -Xms1g \
--jvm-option -Xmx2g
Thêm vào tạm thời khi triển khai:
APP_JAVA_OPTS="-Duser.timezone=Asia/Shanghai" ./run.sh
Cũng có thể chỉnh sửa trực tiếp script triển khai hiện tại:
- macOS/Linux: Thêm
JVM_OPTS+=("-Xms1g" "-Xmx2g")sau các tệpJVM_OPTS=(...)/JVM_OPTS+=(...)đã được tạo ra tạirun.sh. - Windows: Thêm
set "JVM_OPTS=%JVM_OPTS% -Xms1g -Xmx2g"sau các tệpset "JVM_OPTS=..."đã được tạo ra tạirun.bat.
Đừng xóa các tham số nội bộ tự tạo như --add-opens, module path do Spring Boot hoặc JavaFX tạo ra. Việc đóng gói lại sẽ ghi đè lên các thay đổi thủ công; chi tiết xem tại Cấu hình tham số khởi động JVM.
5. Phạm vi bảo vệ
Bảo vệ mặc định các lớp ứng dụng dưới BOOT-INF/classes. Nên giữ các lớp hướng Spring sau làm lớp thông thường:
@Controller,@RestController,@ControllerAdvice;@Configuration, các lớp cấu hình tự động, các lớp được tăng cường bằng AOT/CGLIB;- Jackson DTO, JPA Entity, record và các mô hình kiểm tra;
- Điểm vào ứng dụng và các lớp được framework tạo ra/trực tiếp đại diện;
- Các lớp cần được tăng cường mã byte thời chạy.
Bảo vệ các implementation dịch vụ, truy cập thông qua facade hoặc interface công khai. Quy tắc hỗ trợ tên lớp chính xác, pkg.* và pkg.**.
6. Bảo vệ các JAR phụ thuộc
--protect-lib có thể bảo vệ các phụ thuộc BOOT-INF/lib tương ứng, hỗ trợ cả ba kiểu bố trí:
p4j springboot app.jar dist \
--protect-lib 'company-core-*.jar,pricing-*.jar'
Chỉ bảo vệ các phụ thuộc nguồn mã đóng riêng. Đừng mã hóa các gói framework bên thứ ba như Spring, Tomcat, công cụ ghi nhật ký, trình điều khiển cơ sở dữ liệu vì “Bảo vệ nhiều hơn nữa”.
7. quét khả năng tương thích
p4j springboot app.jar --compat-scan
p4j springboot app.jar dist --compat-apply
Hai tùy chọn này không thể sử dụng đồng thời, sự khác biệt giữa chúng là:
| Tùy chọn | Hành vi | Khi nào nên sử dụng |
|---|---|---|
--compat-scan | Chỉ quét tập tin JAR đầu vào, in ra các mối nguy cơ và gợi ý cấu hình rồi thoát; không mã hóa, không tạo ra dist, vì vậy không cần thư mục đầu ra | Sử dụng công cụ này để xem báo cáo sau khi lần đầu tiên bảo vệ ứng dụng, nâng cấp Spring Boot hoặc các phụ thuộc khác, điều chỉnh phạm vi bảo vệ hoặc bố cục, cũng như khi khắc phục các vấn đề về tính tương thích. |
--compat-apply | Công cụ này sẽ tự động kết hợp các khuyến nghị thận trọng sau khi quét, sau đó tiếp tục lập trình và tạo ra kết quả đầu ra; vì vậy cần phải chỉ định thư mục đầu ra. | Sử dụng công cụ này để hoàn tất việc đóng gói sau khi đã đọc kết quả quét và chấp nhận các khuyến nghị tự động; nó cũng có thể được dùng cho các lần xây dựng lặp lại với các quy tắc đã được kiểm tra hoặc trong quy trình CI. |
Đối với springboot và --compat-apply, có thể chọn bố cục dựa trên kết quả quét, thêm các lớp loại trừ, và điều chỉnh các tùy chọn như ZIP overlay, JavaFX và phần mở rộng tệp sau khi nén. Đối với các tùy chọn ngoài các lớp loại trừ, giá trị được chỉ định rõ ràng trong dòng lệnh sẽ có ưu tiên; các lớp loại trừ được đề xuất sẽ được kết hợp mặc định với --exclude. Nếu không muốn thêm các lớp loại trừ tự động, có thể đồng thời sử dụng --no-compat-excludes. Công cụ quét chỉ thực hiện phân tích heuristic tĩnh, những vấn đề đòi hỏi sửa đổi mã nguồn sẽ không được --compat-apply tự động sửa chữa; vẫn cần tiến hành kiểm thử tái hiện trên nền tảng mục tiêu sau khi tạo ra sản phẩm.
Để biết thêm về các lệnh CLI khác, tất cả các tùy chọn, biến môi trường và ví dụ tự động hóa, vui lòng tham khảo Tham khảo tham số CLI.