Chào bạn,
Ở bài học trước, chúng ta đã thực hiện một bước quan trọng để chuẩn bị cho môi trường production: cấu hình Camunda engine để sử dụng cơ sở dữ liệu PostgreSQL bên ngoài. Điều này đảm bảo dữ liệu quy trình của bạn được lưu trữ một cách bền bỉ và an toàn.
Giờ đây, khi đã có một nền tảng dữ liệu vững chắc, câu hỏi tiếp theo là: làm thế nào để kiểm soát ai có thể truy cập và thao tác trên dữ liệu và các quy trình này? Đây chính là nội dung của bài học hôm nay.
Mục tiêu của bạn là cấu hình authentication và authorization cho Camunda Web Apps và REST API. Chúng ta sẽ tìm hiểu cách:
- Phân biệt hai khái niệm bảo mật cốt lõi: Authentication (Xác thực - "Bạn là ai?") và Authorization (Ủy quyền - "Bạn được phép làm gì?").
- Kích hoạt và thiết lập cơ chế bảo mật cho ứng dụng Camunda của bạn.
- Quản lý quyền truy cập của người dùng và nhóm người dùng một cách chi tiết.
1. Các Khái niệm Cơ bản về Bảo mật trong Camunda
Trước khi đi vào cấu hình, chúng ta cần nắm vững các thành phần tạo nên hệ thống bảo mật của Camunda.
Tài liệu sau đây từ Camunda cung cấp một cái nhìn tổng quan tuyệt vời về các khái niệm nền tảng như Users, Groups, Authentication và Authorizations. Việc hiểu rõ các thành phần này là rất quan trọng.
Hãy đọc các phần "Understanding users, groups and tenants", "Understanding authentication", và "Understanding authorizations". Tập trung vào việc phân biệt vai trò của các khái niệm này: User (người dùng), Group (nhóm), Authentication (xác thực danh tính) và Authorization (cấp quyền truy cập tài nguyên).
Dưới đây là tóm tắt các điểm chính bạn cần ghi nhớ:
- Authentication (Xác thực): Là quá trình xác minh danh tính của người dùng, thường thông qua tên đăng nhập và mật khẩu. Camunda cần biết ai đang thực hiện yêu cầu.
- Authorization (Ủy quyền): Là quá trình quyết định xem người dùng đã được xác thực có quyền truy cập vào một tài nguyên cụ thể hay không. Ví dụ: user
johncó quyền xem Tasklist nhưng không có quyền truy cập Cockpit. - Identities (Danh tính): Camunda quản lý danh tính thông qua
Users(người dùng cá nhân) vàGroups(tập hợp người dùng). - Resources (Tài nguyên): Là bất cứ thứ gì trong Camunda mà bạn muốn kiểm soát quyền truy cập, ví dụ: Process Definitions, Tasks, Process Instances, và chính các ứng dụng web (Cockpit, Tasklist, Admin).
- Permissions (Quyền hạn): Là các hành động cụ thể mà một danh tính có thể thực hiện trên một tài nguyên (ví dụ:
READ,UPDATE,CREATE,DELETE,ACCESS).
Hai service chính của engine chịu trách nhiệm cho việc này là:
- IdentityService: Quản lý users và groups. Nó có thể sử dụng cơ sở dữ liệu của Camunda hoặc tích hợp với một hệ thống bên ngoài như LDAP.
- AuthorizationService: Quản lý các quy tắc ủy quyền (authorizations), liên kết users/groups với resources và permissions.
2. Luồng xử lý Bảo mật trong Camunda
Để hiểu rõ hơn cách các thành phần này phối hợp với nhau, hãy xem xét luồng xử lý một yêu cầu từ người dùng đến Camunda.

Luồng hoạt động như sau:
- Một yêu cầu được gửi đến một endpoint của REST API hoặc một trang của Web App (ví dụ: Cockpit).
- Authentication Filter chặn yêu cầu này lại. Nó trích xuất thông tin xác thực (ví dụ: từ HTTP Basic Auth header hoặc session cookie).
- Filter sử dụng
IdentityServiceđể xác minh thông tin xác thực. Nếu hợp lệ, nó sẽ lấy thông tin về user, các group mà user đó thuộc về. - Danh tính của người dùng đã xác thực được thiết lập cho luồng (thread) hiện tại.
- Yêu cầu được chuyển tiếp đến lớp API của Camunda.
- Khi API thực hiện một truy vấn (ví dụ:
taskService.createTaskQuery()),AuthorizationServicesẽ được kích hoạt. Nó sẽ tự động thêm các điều kiện vào câu lệnh SQL để đảm bảo rằng kết quả trả về chỉ bao gồm những tài nguyên mà người dùng hiện tại có quyền xem.
Cách tiếp cận này rất hiệu quả vì việc lọc dữ liệu được thực hiện ở tầng cơ sở dữ liệu, đảm bảo tính bảo mật và hiệu năng.
3. Thực hành: Kích hoạt Authentication và Authorization
Mặc định, để giúp người dùng mới dễ dàng bắt đầu, Camunda tắt tính năng kiểm tra ủy quyền. Bây giờ, chúng ta sẽ kích hoạt nó và tạo người dùng quản trị đầu tiên.
Bước 1: Kích hoạt Authorization trong application.yml
Trong dự án Spring Boot của bạn, hãy mở file src/main/resources/application.yml và thêm vào thuộc tính sau:
camunda.bpm:
authorization:
enabled: true
Việc đặt enabled: true sẽ yêu cầu Camunda Engine thực hiện kiểm tra ủy quyền cho mọi tương tác với API. Nếu bạn khởi động lại ứng dụng ngay bây giờ và thử truy cập Cockpit, bạn sẽ bị từ chối vì chưa có người dùng nào được cấp quyền.
Bước 2: Tạo người dùng Quản trị (Admin) ban đầu
Để có thể quản lý hệ thống, chúng ta cần một người dùng có toàn quyền. Cách tốt nhất trong môi trường Spring Boot là tạo người dùng này một cách tự động khi ứng dụng khởi động.
Camunda có một khái niệm đặc biệt là nhóm camunda-admin. Bất kỳ người dùng nào thuộc nhóm này sẽ tự động được cấp toàn bộ quyền hạn.
Hãy tạo một lớp cấu hình trong dự án của bạn để tạo user và group này.
- Tạo một file Java mới, ví dụ:
AdminUserInitializer.java. - Thêm đoạn mã sau. Đoạn mã này sẽ chạy một lần sau khi ứng dụng Spring Boot khởi động.
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.authorization.Groups;
import org.camunda.bpm.engine.identity.Group;
import org.camunda.bpm.engine.identity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
@Component
public class AdminUserInitializer {
@Autowired
private ProcessEngine processEngine;
@PostConstruct
public void createAdminUser() {
var identityService = processEngine.getIdentityService();
// Chỉ tạo user nếu chưa tồn tại
if (identityService.createUserQuery().userId("admin").count() == 0) {
// 1. Tạo user mới
User adminUser = identityService.newUser("admin");
adminUser.setFirstName("Admin");
adminUser.setLastName("User");
adminUser.setPassword("admin");
adminUser.setEmail("admin@example.com");
identityService.saveUser(adminUser);
// 2. Tạo group camunda-admin nếu chưa tồn tại
if (identityService.createGroupQuery().groupId(Groups.CAMUNDA_ADMIN).count() == 0) {
Group adminGroup = identityService.newGroup(Groups.CAMUNDA_ADMIN);
adminGroup.setName("Camunda Administrators");
adminGroup.setType(Groups.GROUP_TYPE_SYSTEM);
identityService.saveGroup(adminGroup);
}
// 3. Thêm user vào group camunda-admin
identityService.createMembership("admin", Groups.CAMUNDA_ADMIN);
}
}
}
Sau khi thêm lớp này, hãy khởi động lại ứng dụng của bạn.
Bước 3: Đăng nhập và xác thực
Bây giờ, hãy truy cập lại một trong các ứng dụng web của Camunda, ví dụ: http://localhost:8080/camunda/app/cockpit/.
Bạn sẽ được chuyển đến trang đăng nhập. Hãy sử dụng thông tin bạn vừa tạo:
- Username:
admin - Password:
admin
Bạn sẽ đăng nhập thành công và có toàn quyền truy cập vào Cockpit, Admin và Tasklist.
Đối với REST API, cơ chế bảo mật cũng được kích hoạt. Nếu bạn thử gọi một endpoint bằng Postman mà không cung cấp thông tin xác thực, bạn sẽ nhận được lỗi 401 Unauthorized. Để gọi API thành công, bạn cần thêm HTTP Basic Authentication với username và password là admin/admin.
4. Quản lý Authorizations trong Camunda Admin
Việc tạo người dùng admin chỉ là bước khởi đầu. Trong thực tế, bạn sẽ cần tạo ra các vai trò với quyền hạn bị giới hạn. Camunda Admin là công cụ hoàn hảo cho việc này.
Hãy đăng nhập với tài khoản admin và truy cập ứng dụng Admin (/camunda/app/admin/).
Authorization Service | docs.cibseven.org
Tài liệu về Authorization Service này sẽ giải thích chi tiết các loại tài nguyên, quyền hạn, và cách chúng được áp dụng. Đây là kiến thức cần thiết để bạn có thể cấu hình ủy quyền một cách hiệu quả.
Đọc các phần "Basic Principles" để hiểu về các loại Authorization, "Permissions by Resource" để xem danh sách chi tiết các quyền hạn cho từng loại tài nguyên, và xem qua mục "Camunda Admin Webapp" để biết rằng có giao diện hỗ trợ cho việc này.

Bài tập thực hành: Tạo vai trò "Nhân viên"
Hãy cùng thực hiện một kịch bản phổ biến: tạo một vai trò "nhân viên" (clerk) chỉ có quyền truy cập Tasklist để làm việc trên các task được giao, nhưng không thể xem báo cáo trong Cockpit hay thay đổi cấu hình trong Admin.
Các bước thực hiện (trong Camunda Admin):
-
Tạo User và Group:
- Vào
Users->Create New User. Tạo một user tên làjohnvới mật khẩujohn. - Vào
Groups->Create New Group. Tạo một group với ID làclerksvà tên làClerks. - Trong trang của group
clerks, qua tabUsersvà thêmjohnvào group này.
- Vào
-
Cấu hình Authorizations cho Group
clerks:- Vào
Authorizations->Application. - Nhấn
Create new authorization. - Trong mục
Group, nhậpclerks. - Trong
Permissions, chọnACCESSchoResource IDlàtasklist. Nhấn+. - Lặp lại các bước trên để tạo các quyền
ACCESSchocockpitvàadmin, nhưng lần này hãy chọn loạiREVOKE(thu hồi) thay vìALLOW.
- Vào
-
Cấp quyền trên Process Definition:
- Vào
Authorizations->Process Definition. - Chọn một quy trình bất kỳ từ danh sách (ví dụ:
payment-process). - Nhấn
Create new authorization. - Chọn
Grouplàclerks. - Cấp các quyền sau:
READ: Để thấy được định nghĩa quy trình.READ_HISTORY: Để xem lịch sử các instance đã chạy.CREATE_INSTANCE: Để có thể bắt đầu một instance mới của quy trình này.
- Vào
-
Cấp quyền trên Task:
- Vào
Authorizations->Task. - Tạo một authorization mới cho group
clerks. - Cấp các quyền sau trên
Resource IDlà*(áp dụng cho tất cả các task):READ: Để xem thông tin task.UPDATE: Để có thể claim và complete task.
- Vào
-
Kiểm tra kết quả:
- Đăng xuất khỏi tài khoản
admin. - Đăng nhập với tài khoản
john/john. - Bạn sẽ thấy
johnchỉ có thể truy cập vào ứng dụng Tasklist. Cockpit và Admin sẽ không hiển thị. - Trong Tasklist,
johncó thể bắt đầu một quy trình mới và làm việc trên các task được gán cho mình hoặc cho groupclerks.
- Đăng xuất khỏi tài khoản
5. Các Chủ đề Nâng cao (Giới thiệu)
Với nền tảng là một developer, bạn có thể sẽ quan tâm đến các khả năng tùy chỉnh sâu hơn:
- Tích hợp với LDAP/SSO: Thay vì quản lý user trong CSDL của Camunda, bạn có thể cấu hình
IdentityServiceđể đọc user/group từ một thư mục LDAP (như Active Directory) hoặc tích hợp với hệ thống Single Sign-On (SSO) của công ty bạn. Điều này được thực hiện bằng cách thay thế hoặc tùy chỉnhAuthenticationFilter. (Tham khảo thêm trong tài liệu LINK đã đọc ở đầu bài). - Hiệu năng: Việc sử dụng quyền
REVOKEcó thể ảnh hưởng đến hiệu năng truy vấn trên các CSDL nhất định, đặc biệt với số lượng task hoặc process instance lớn. Camunda khuyến nghị ưu tiên sử dụng quyềnGRANTvà chỉ dùngREVOKEkhi thực sự cần thiết.
Tổng kết
Qua bài học này, bạn đã thiết lập thành công một lớp bảo mật toàn diện cho ứng dụng Camunda của mình. Các điểm chính cần nhớ:
- Authentication xác minh bạn là ai, Authorization quyết định bạn được làm gì.
- Kích hoạt ủy quyền trong Spring Boot bằng cách đặt
camunda.bpm.authorization.enabled: true. - Cần tạo một người dùng quản trị ban đầu (thường thuộc nhóm
camunda-admin) để có thể cấu hình hệ thống. - Camunda Admin là công cụ mạnh mẽ để quản lý các quyền hạn một cách trực quan cho từng user và group trên từng loại tài nguyên.
- Quyền
ACCESSkiểm soát việc truy cập vào các ứng dụng web (Cockpit, Tasklist, Admin).
Xem trước bài học tiếp theo
Chúng ta đã đi qua gần hết các khía cạnh vận hành và bảo trì một hệ thống Camunda. Trong module cuối cùng của khóa học, chúng ta sẽ lùi lại một bước để nhìn vào bức tranh lớn hơn về mặt kiến trúc.
Bài học tiếp theo, "Phân tích các mô hình kiến trúc cho workflow engine (embedded vs. remote)", sẽ khám phá các cách khác nhau để triển khai Camunda Engine trong hệ thống của bạn, từ việc nhúng trực tiếp vào ứng dụng (như chúng ta đã làm) đến việc chạy nó như một service độc lập. Điều này sẽ giúp bạn đưa ra lựa chọn thiết kế phù hợp nhất cho các dự án trong tương lai.