[CLAUDE] Auth: public module Nhân sự (Hồ sơ NS) read-only cho mọi role
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 4m40s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 4m40s
Anh user yêu cầu public module Nhân sự cho user thường tra cứu hồ sơ. Thêm SeedAllRolesHrmProfileReadPermissionsAsync (DbInitializer) grant CanRead cho Hrm + Hrm_HoSo cho 13 role, chạy SAU RevokeTemporarilyHiddenModulesAsync (S58) để thắng revoke. Upgrade-only (nâng false→true trên row prod đã tồn tại, mirror Pe S57bis :2107) — không NO-OP im lặng. Read-only: chỉ CanRead; Create/Update/Delete vẫn khóa qua policy controller. Giữ ẩn Dashboard NS + Hrm_Config*. Migration-free, idempotent. Reviewer PASS 7/7. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@ -2038,6 +2038,12 @@ public static class DbInitializer
|
|||||||
// (GetMyMenuTree lọc CanRead). Chạy SAU grant seed để revoke thắng.
|
// (GetMyMenuTree lọc CanRead). Chạy SAU grant seed để revoke thắng.
|
||||||
// Mở lại sau golive: gỡ prefix khỏi revoke + thêm lại vào InReviewScope.
|
// Mở lại sau golive: gỡ prefix khỏi revoke + thêm lại vào InReviewScope.
|
||||||
await RevokeTemporarilyHiddenModulesAsync(db, roleManager, logger);
|
await RevokeTemporarilyHiddenModulesAsync(db, roleManager, logger);
|
||||||
|
|
||||||
|
// [S65 2026-06-16] CHẠY SAU revoke để THẮNG: mở lại quyền XEM "Hồ sơ Nhân sự"
|
||||||
|
// (+ root nhóm "Nhân sự") cho MỌI role — anh chốt public module Nhân sự cho
|
||||||
|
// 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// [S57] Cấp CanRead (CHỈ xem) cho MỌI role trên menu HRM + Office + Master để mọi
|
// [S57] Cấp CanRead (CHỈ xem) cho MỌI role trên menu HRM + Office + Master để mọi
|
||||||
@ -2183,6 +2189,66 @@ public static class DbInitializer
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// [S65 2026-06-16] Mở quyền XEM (Read-only) "Hồ sơ Nhân sự" cho MỌI role: anh chốt
|
||||||
|
// public module Nhân sự (trọng tâm Hồ sơ NS) để user thường tra cứu hồ sơ nhân sự.
|
||||||
|
// CHẠY SAU RevokeTemporarilyHiddenModulesAsync (SeedAsync) để THẮNG revoke: revoke
|
||||||
|
// set mọi Hrm* = false cho non-Admin; method này nâng RIÊNG 2 key Hrm + Hrm_HoSo.
|
||||||
|
// - GIỮ ẨN: Dashboard NS (Hrm_Dashboard) + 6 catalog Hrm_Config* — vẫn bị revoke che.
|
||||||
|
// - Read-only: chỉ CanRead. Create/Update/Delete hồ sơ vẫn khóa qua policy
|
||||||
|
// Hrm_HoSo.{Create/Update/Delete} (EmployeesController) — non-Admin không có.
|
||||||
|
// - UPGRADE-ONLY (mirror Pe S57bis :2107): row đã tồn tại (revoke vừa set CanRead
|
||||||
|
// =false trên prod) → NÂNG CanRead=true. Row chưa có (DB mới) → tạo CanRead=true,
|
||||||
|
// cờ khác false. KHÔNG hạ + KHÔNG đụng Create/Update/Delete (không phá quyền admin).
|
||||||
|
// 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 SeedAllRolesHrmProfileReadPermissionsAsync(
|
||||||
|
ApplicationDbContext db, RoleManager<Role> roleManager, ILogger logger)
|
||||||
|
{
|
||||||
|
// Root nhóm "Nhân sự" (để menu group hiện chắc chắn) + leaf "Hồ sơ Nhân sự".
|
||||||
|
// KHÔNG Hrm_Dashboard, KHÔNG Hrm_Config* (giữ ẩn theo scope anh chốt).
|
||||||
|
var hrmKeys = new[] { MenuKeys.Hrm, MenuKeys.HrmHoSo };
|
||||||
|
var roles = await roleManager.Roles.ToListAsync();
|
||||||
|
|
||||||
|
var existingRows = (await db.Permissions
|
||||||
|
.Where(p => hrmKeys.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 hrmKeys)
|
||||||
|
{
|
||||||
|
if (existingRows.TryGetValue((role.Id, key), out var row))
|
||||||
|
{
|
||||||
|
// Upgrade-only: nâng CanRead nếu đang false (revoke vừa set false).
|
||||||
|
if (!row.CanRead) { row.CanRead = true; upgraded++; }
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
db.Permissions.Add(new Permission
|
||||||
|
{
|
||||||
|
RoleId = role.Id,
|
||||||
|
MenuKey = key,
|
||||||
|
CanRead = true,
|
||||||
|
CanCreate = false,
|
||||||
|
CanUpdate = false,
|
||||||
|
CanDelete = false,
|
||||||
|
});
|
||||||
|
added++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (added > 0 || upgraded > 0)
|
||||||
|
{
|
||||||
|
await db.SaveChangesAsync();
|
||||||
|
logger.LogInformation(
|
||||||
|
"Seeded all-roles HRM profile read perms: {Added} added + {Upgraded} upgraded " +
|
||||||
|
"(Hrm + Hrm_HoSo CanRead — public Hồ sơ NS, S65)",
|
||||||
|
added, upgraded);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// [Plan CA S29 2026-05-22] Permission defaults cho role CatalogManager.
|
// [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:
|
// Strategy: full CRUD trên 9 menu key danh mục dùng chung:
|
||||||
// - Master (root group) + Suppliers + Projects + Departments
|
// - Master (root group) + Suppliers + Projects + Departments
|
||||||
|
|||||||
Reference in New Issue
Block a user