Bỏ qua, đến nội dung

FAQ — Câu hỏi thường gặp ​

Quản lý user ​

Tại sao không xóa được user đầu tiên (id=1)? ​

User id = 1 là root user — tài khoản quản trị cao nhất được tạo khi cài đặt hệ thống. Plugin đăng ký ACL fixedParams bảo vệ user này: mọi request users:destroy đều tự động thêm filter id.$ne: 1. Đây là cơ chế bảo vệ ở tầng server, không thể bypass từ client.

Tại sao không xóa được collection users? ​

Tương tự root user, collection users được bảo vệ bởi fixedParams trên action collections:destroy với filter name.$ne: 'users'. Nếu xóa collection users, toàn bộ hệ thống authentication và authorization sẽ ngừng hoạt động.

Mật khẩu mặc định của root user là gì? ​

Khi cài đặt, root user được tạo từ biến môi trường. Nếu không cấu hình, giá trị mặc định là:

  • Email: admin@digiforce.vn
  • Username: digiforce
  • Password: DigiM@t3
  • Display name: Super Admin

Bạn nên thay đổi mật khẩu ngay sau lần đăng nhập đầu tiên.

Profile và cài đặt ​

User có thể tự sửa những field nào trong profile? ​

Danh sách field được phép sửa không cố định — nó được derive từ UI schema có uid digiforce-user-profile-edit-form. Mặc định, schema cho phép sửa: displayname, username, email, phone. Các field có x-read-pretty hoặc x-disabled bị loại ra. Field roles và password không nằm trong user profile edit schema.

Tại sao updateProfile trả về 403? ​

Admin đã tắt tính năng chỉnh sửa profile. Kiểm tra cài đặt hệ thống:

http
GET /api/users:getSystemSettings

Nếu enableEditProfile là false, bật lại bằng:

http
POST /api/users:updateSystemSettings
Content-Type: application/json

{ "enableEditProfile": true }

Tại sao đổi mật khẩu xong bị đăng xuất? ​

Đây là hành vi có chủ đích. Khi password thay đổi, server:

  1. Ghi timestamp vào passwordChangeTz
  2. Xóa cache roles (cache:del:roles)
  3. Xóa cache auth (cache:del:auth)

Tất cả session cũ trở nên không hợp lệ, buộc user phải đăng nhập lại với mật khẩu mới.

Filter và operator ​

Cách dùng $isCurrentUser trong filter? ​

Operator $isCurrentUser dùng để lọc record thuộc user đang đăng nhập. Ví dụ, chỉ hiển thị đơn hàng do mình tạo:

json
{
  "filter": {
    "createdById": { "$isCurrentUser": true }
  }
}

Nếu user chưa đăng nhập, operator so sánh với id = -1 (không match bất kỳ record nào).

$isVar dùng khi nào? ​

$isVar cho phép filter theo giá trị động từ context state. Ví dụ, lọc theo department của user hiện tại:

json
{
  "filter": {
    "departmentId": { "$isVar": "currentUser.departmentId" }
  }
}

Giá trị được parse từ ctx.state bằng template engine.

Đồng bộ dữ liệu ​

Làm thế nào để đồng bộ user từ hệ thống bên ngoài? ​

Cần kích hoạt plugin user-data-sync. Khi đó, UserDataSyncResource tự động đăng ký và hỗ trợ:

  • Match key: phone, email, hoặc username — dùng để xác định user đã tồn tại hay chưa
  • Create: Tạo user mới hoặc cập nhật nếu đã tồn tại theo match key
  • Update: Cập nhật thông tin user, hoặc xóa nếu isDeleted: true (trừ user có role root)
  • Lọc field: Tự động loại bỏ các field hệ thống (id, password, createdAt, updatedAt, sort...) từ dữ liệu nguồn

Đồng bộ có xóa được root user không? ​

Không. Khi nhận lệnh xóa (isDeleted = true), UserDataSyncResource kiểm tra tất cả role của user. Nếu có role root, user sẽ không bị xóa. Đây là lớp bảo vệ bổ sung ngoài ACL fixedParams.