[CLAUDE] Auth: golive Văn phòng số — public Read+Create module Office cho mọi role (allow-list 16 key) + 6 test
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 4m33s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 4m33s
Anh chốt "public văn phòng số cho all user eoffice". Mở quyền Xem + Tạo (self-service) module Office cho mọi role trên cả 2 app. - NEW SeedAllRolesOfficeModulePermissionsAsync (DbInitializer): grant CanRead+CanCreate=true cho allow-list 16 key Office, chạy SAU RevokeTemporarilyHiddenModulesAsync để THẮNG revoke (mirror đúng pattern S65 HRM public). Upgrade-only: nâng false→true trên row prod đã có, KHÔNG hạ, KHÔNG đụng CanUpdate/CanDelete. No migration (seed-logic, idempotent). - ALLOW-LIST 16: Off + Off_Dashboard + Off_DanhBa + Off_PhongHop(View/Book) + Off_DeXuat(List/Create/Inbox) + Off_DonTu(Leave/Ot/Travel) + Off_DatXe + Off_ItTicket. - GIỮ ẨN (ngoài allow-list → revoke vẫn che non-Admin): Off_PhongHop_Manage (admin CRUD phòng), Off_AttendanceReport (báo cáo chấm công — riêng tư), Off_ChamCong (Cá nhân — golive riêng). HRM (trừ Hồ sơ NS S65) + Personal VẪN ẩn (anh chỉ mở Office). - reviewer PASS 0 blocker (security): cascade-safe (Off KHÔNG phải inherit-root trong GetMyMenuTree → excluded-3 giữ false, không lan); KHÔNG mở write-path thật (Office controller dùng [Authorize] self-service + [Authorize(Roles=Admin)] cho admin-write — CanCreate chỉ mở menu + nút tạo FE, API authz độc lập menu key; quản lý phòng double-protected). - +6 test OfficeModulePermissionSeedTests (286→292) lock: allow-list read+create=true · excluded-3 stay hidden (load-bearing) · admin not demoted · no-leak HRM/Personal · upgrade-only preserves admin-raised Update/Delete. - Build slnx 0/0 · dotnet test 292 PASS. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -2046,6 +2046,13 @@ public static class DbInitializer
|
||||
// user thường tra cứu hồ sơ. Dashboard NS (Hrm_Dashboard) + 6 catalog
|
||||
// Hrm_Config* VẪN ẨN (revoke che). Read-only (chỉ CanRead).
|
||||
await SeedAllRolesHrmProfileReadPermissionsAsync(db, roleManager, logger);
|
||||
|
||||
// [S69 2026-06-17] GOLIVE Văn phòng số: mở Read+Create module Office (self-service)
|
||||
// cho MỌI role — anh chốt "public văn phòng số cho all user eoffice". CHẠY SAU revoke
|
||||
// để THẮNG (mirror S65). Allow-list 16 key (loại Off_PhongHop_Manage admin-CRUD +
|
||||
// Off_AttendanceReport báo-cáo-riêng-tư + Off_ChamCong Cá-nhân — giữ ẩn). HRM (trừ
|
||||
// Hồ sơ NS) + Personal VẪN ẩn (anh chỉ mở Office).
|
||||
await SeedAllRolesOfficeModulePermissionsAsync(db, roleManager, logger);
|
||||
}
|
||||
|
||||
// [S57] Cấp CanRead (CHỈ xem) cho MỌI role trên menu HRM + Office + Master để mọi
|
||||
@ -2251,6 +2258,80 @@ public static class DbInitializer
|
||||
}
|
||||
}
|
||||
|
||||
// [S69 2026-06-17] GOLIVE Văn phòng số: mở quyền XEM + TẠO (Read+Create) module Office
|
||||
// cho MỌI role — anh chốt "public văn phòng số cho all user eoffice". Self-service tạo
|
||||
// phiếu (đề xuất / đơn từ / đặt xe / ticket / đặt phòng) giống Pe (S57bis read+create).
|
||||
// CHẠY SAU RevokeTemporarilyHiddenModulesAsync (SeedAsync) để THẮNG revoke (mirror S65
|
||||
// HRM): revoke set mọi Off* = false cho non-Admin; method này nâng RIÊNG allow-list.
|
||||
// - ALLOW (read+create, 16 key): Off root + Dashboard + DanhBa + PhongHop(View/Book) +
|
||||
// DeXuat(List/Create/Inbox) + DonTu(Leave/Ot/Travel) + DatXe + ItTicket.
|
||||
// - GIỮ ẨN (KHÔNG trong allow-list → revoke vẫn che cho non-Admin): Off_PhongHop_Manage
|
||||
// (Admin CRUD phòng), Off_AttendanceReport (báo cáo admin — riêng tư), Off_ChamCong
|
||||
// (re-parent Cá nhân — golive riêng). HRM (trừ Hồ sơ NS S65) + Personal VẪN ẩn.
|
||||
// - Write thật (quản lý phòng/duyệt phiếu) vẫn khóa ở controller theo role; CanCreate chỉ
|
||||
// mở menu + nút tạo self-service (API self-service = [Authorize] thường).
|
||||
// - UPGRADE-ONLY (mirror Pe S57bis / HRM S65): row đã tồn tại (revoke vừa set false trên
|
||||
// prod) → NÂNG CanRead+CanCreate=true. Row chưa có → tạo read+create=true, Update/Delete
|
||||
// =false. KHÔNG hạ + KHÔNG đụng Update/Delete (không phá quyền admin đã chỉnh cao hơn).
|
||||
// Flip ẩn lại khi cần: xóa call ở SeedAsync — revoke sẽ tự che lại lần seed kế.
|
||||
private static async Task SeedAllRolesOfficeModulePermissionsAsync(
|
||||
ApplicationDbContext db, RoleManager<Role> roleManager, ILogger logger)
|
||||
{
|
||||
// Allow-list self-service Văn phòng số (KHÔNG Manage/AttendanceReport/ChamCong).
|
||||
var officeKeys = new[]
|
||||
{
|
||||
MenuKeys.Off, MenuKeys.OffDashboard, MenuKeys.OffDanhBa,
|
||||
MenuKeys.OffPhongHop, MenuKeys.OffPhongHopView, MenuKeys.OffPhongHopBook,
|
||||
MenuKeys.OffDeXuat, MenuKeys.OffDeXuatList, MenuKeys.OffDeXuatCreate, MenuKeys.OffDeXuatInbox,
|
||||
MenuKeys.OffDonTu, MenuKeys.OffDonTuLeave, MenuKeys.OffDonTuOt, MenuKeys.OffDonTuTravel,
|
||||
MenuKeys.OffDatXe, MenuKeys.OffItTicket,
|
||||
};
|
||||
var roles = await roleManager.Roles.ToListAsync();
|
||||
|
||||
var existingRows = (await db.Permissions
|
||||
.Where(p => officeKeys.Contains(p.MenuKey))
|
||||
.ToListAsync())
|
||||
.ToDictionary(p => (p.RoleId, p.MenuKey));
|
||||
|
||||
var added = 0;
|
||||
var upgraded = 0;
|
||||
foreach (var role in roles)
|
||||
{
|
||||
foreach (var key in officeKeys)
|
||||
{
|
||||
if (existingRows.TryGetValue((role.Id, key), out var row))
|
||||
{
|
||||
// Upgrade-only: nâng CanRead/CanCreate nếu đang false (revoke vừa set false).
|
||||
var changed = false;
|
||||
if (!row.CanRead) { row.CanRead = true; changed = true; }
|
||||
if (!row.CanCreate) { row.CanCreate = true; changed = true; }
|
||||
if (changed) upgraded++;
|
||||
continue;
|
||||
}
|
||||
|
||||
db.Permissions.Add(new Permission
|
||||
{
|
||||
RoleId = role.Id,
|
||||
MenuKey = key,
|
||||
CanRead = true,
|
||||
CanCreate = true,
|
||||
CanUpdate = false,
|
||||
CanDelete = false,
|
||||
});
|
||||
added++;
|
||||
}
|
||||
}
|
||||
|
||||
if (added > 0 || upgraded > 0)
|
||||
{
|
||||
await db.SaveChangesAsync();
|
||||
logger.LogInformation(
|
||||
"Seeded all-roles Office module perms: {Added} added + {Upgraded} upgraded " +
|
||||
"(Văn phòng số read+create — golive S69)",
|
||||
added, upgraded);
|
||||
}
|
||||
}
|
||||
|
||||
// [Plan CA S29 2026-05-22] Permission defaults cho role CatalogManager.
|
||||
// Strategy: full CRUD trên 9 menu key danh mục dùng chung:
|
||||
// - Master (root group) + Suppliers + Projects + Departments
|
||||
|
||||
Reference in New Issue
Block a user