Giao diện
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:getSystemSettingsNế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:
- Ghi timestamp vào
passwordChangeTz - Xóa cache roles (
cache:del:roles) - 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ặcusername— 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ó roleroot) - 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.