Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 59

Cấu hình xác thực và ủy quyền cho Camunda

Recommended resources

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.

Securing Camunda 7

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 john có 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à:

  1. 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.
  2. 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.

Camunda Security Architecture: Authentication and Authorization
Sơ đồ kiến trúc bảo mật của Camunda. Sơ đồ này minh họa cách một yêu cầu (request) đến Web Apps hoặc REST API được xử lý qua Authentication Filter, sử dụng Identity Service để xác thực và Authorization Service để kiểm tra quyền hạn trước khi thực thi.

Luồng hoạt động như sau:

  1. 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).
  2. 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).
  3. 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ề.
  4. 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.
  5. Yêu cầu được chuyển tiếp đến lớp API của Camunda.
  6. Khi API thực hiện một truy vấn (ví dụ: taskService.createTaskQuery()), AuthorizationService sẽ đượ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.

  1. Tạo một file Java mới, ví dụ: AdminUserInitializer.java.
  2. 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.

Camunda Admin: Process Definition Authorizations
Giao diện quản lý Authorizations trong Camunda Admin. Tại đây, bạn có thể cấp hoặc thu hồi các quyền (Permissions) trên từng tài nguyên (Resource) cho một User hoặc Group cụ thể.

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):

  1. Tạo User và Group:

    • Vào Users -> Create New User. Tạo một user tên là john với mật khẩu john.
    • Vào Groups -> Create New Group. Tạo một group với ID là clerks và tên là Clerks.
    • Trong trang của group clerks, qua tab Users và thêm john vào group này.
  2. Cấu hình Authorizations cho Group clerks:

    • Vào Authorizations -> Application.
    • Nhấn Create new authorization.
    • Trong mục Group, nhập clerks.
    • Trong Permissions, chọn ACCESS cho Resource ID là tasklist. Nhấn +.
    • Lặp lại các bước trên để tạo các quyền ACCESS cho cockpit và admin, nhưng lần này hãy chọn loại REVOKE (thu hồi) thay vì ALLOW.
  3. 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 Group là 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.
  4. 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 ID là * (áp dụng cho tất cả các task):
      • READ: Để xem thông tin task.
      • UPDATE: Để có thể claim và complete task.
  5. 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 john chỉ có thể truy cập vào ứng dụng Tasklist. Cockpit và Admin sẽ không hiển thị.
    • Trong Tasklist, john có 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 group clerks.

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ỉnh AuthenticationFilter. (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 REVOKE có 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ền GRANT và chỉ dùng REVOKE khi 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 ACCESS kiể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.