From 004b2dff1fb3f265cc3910ad072999bfc88e0251 Mon Sep 17 00:00:00 2001 From: king Date: Fri, 29 May 2026 03:01:03 +0900 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=EC=8A=B9=EC=9D=B8=EC=9E=90=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EB=B3=B4=EC=9C=A0=EC=9E=90=EB=8A=94=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EB=AA=A8=EB=93=88=20=EC=A0=91=EA=B7=BC=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit expense_approver 권한만 가진 관리자가 본인 경비를 등록/제출할 수 있도록 has_module() 에서 _approver 보유 시 접근도 허용. APPROVER_KEYS 자체에는 재귀 적용하지 않음 (vacation_approver 가 expense_approver 를 부여하는 일은 없음). --- app/store.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/store.py b/app/store.py index 4ccf352..87f29e5 100644 --- a/app/store.py +++ b/app/store.py @@ -228,7 +228,15 @@ def has_module(user_rec: dict[str, Any] | None, module: str) -> bool: if is_admin(user_rec): return True mods = user_rec.get("modules") or {} - return bool(mods.get(module)) + if mods.get(module): + return True + # 승인자(_approver) 권한이 있으면 해당 모듈 접근도 허용 — + # 본인 경비 등록/제출도 가능해야 하므로. + if module in APPROVER_KEYS: + return False + if mods.get(f"{module}_approver"): + return True + return False def is_approver(user_rec: dict[str, Any] | None, kind: str) -> bool: