Giao diện
FAQ
Đổi quyền rồi user vẫn thấy như cũ?
Nguyên nhân: Client cache menu/permission. Server-side thì ACL đã cập nhật ngay khi lưu.
Giải pháp:
- User refresh trang (F5).
- Hoặc đăng xuất rồi đăng nhập lại.
- Nếu chạy multi-instance, kiểm tra
syncRolemessage có đến instance đang serve user không.
Tại sao view/export tách field quan hệ sang appends?
Hook beforeGrantAction với action view và export tự động chuyển field kiểu relation (belongsTo, hasMany...) từ fields sang appends. Lý do: Sequelize yêu cầu relation data phải load qua include (appends), không phải attributes (fields).
Client cần gửi request kèm appends tương ứng nếu muốn hiển thị dữ liệu quan hệ.
Tại sao view tự thêm id, createdAt, updatedAt?
Hook beforeGrantAction cho action view luôn bổ sung primary key và timestamp fields (nếu có trên model). Điều này đảm bảo:
- Client luôn có
idđể render danh sách (rowKey). - Timestamp hiển thị ổn định ngay cả khi admin chỉ chọn subset field.
Có thể tắt ACL cho một data source?
Có. Trong afterAddDataSource, middleware checkQueryPermission / checkChangesWithAssociation chỉ gắn khi:
typescript
dataSource.options.acl !== false && useACL !== falseĐặt acl: false khi định nghĩa data source. Tuy nhiên, cân nhắc rủi ro bảo mật - data source đó sẽ không có kiểm soát quyền.
Role anonymous ở đâu?
Middleware roles:list mặc định lọc bỏ name != anonymous trừ khi client truyền query param showAnonymous. Mục đích: tránh lộ role ẩn trên UI công khai.
anonymous dùng cho request không xác thực (public API/pages).
Lỗi "No permissions" khi gán role root cho user?
rolesUsers.beforeSave chặn đổi roleName thành root qua API quan hệ. Đây là thiết kế chống leo thang quyền - ngăn admin gán superuser cho user khác qua UI.
Chỉ có thể gán root trực tiếp trong DB hoặc qua seed khi install.
writeRolesToACL khi nào chạy?
afterStart- mỗi lần app khởi động, load toàn bộ role (phần strategy trước, resource sau).- Hooks - mỗi khi CRUD role/resource/action, hooks tự động đồng bộ.
- Thủ công - chỉ cần khi repair dữ liệu sau migrate trực tiếp DB.
Union role là gì?
Union role (__union__) merge quyền từ tất cả role của user thành một. Ví dụ user có role editor (view/update articles) và reviewer (view/approve reviews) → union role có tất cả quyền từ cả hai.
Kích hoạt qua Role mode setting (xem Hướng dẫn UI).
Tại sao collection mới không xuất hiện trong danh sách permission?
Hook afterDefineCollection / afterUpdateCollection gọi appendStrategyResource khi collection load từ collection manager. Kiểm tra:
- Collection có
asStrategyResource/loadedFromCollectionManagerđúng không. - Collection có
hiddenhoặc bị filter không.
Thêm field mới nhưng quyền cũ không có field đó?
Hook fields.afterCreate tự động append tên field vào mọi dataSourcesRolesResourcesActions của collection đó. Nếu không thấy:
- Kiểm tra hook có chạy (xem log).
- Kiểm tra transaction có bị rollback.
- Repair: lưu lại permission cho collection đó trên UI.