From 7e32e0f22b48577d939c0a04ccbe326fc384da3f Mon Sep 17 00:00:00 2001 From: theorose49 Date: Thu, 2 Jul 2026 09:24:50 +0900 Subject: [PATCH] =?UTF-8?q?feat(dev):=20DEV=5FAUTH=EC=97=90=20=3Fas=3D=20=EC=9E=84=ED=8F=AC=EC=84=9C=EB=84=A4=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?(=EB=A1=9C=EC=BB=AC=20=EB=A9=80=ED=8B=B0=EC=9C=A0=EC=A0=80=20QA?= =?UTF-8?q?=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - devAuth일 때만 동작 → prod(devAuth=false) 무영향 - ?as=user(고정 데모) 외에 ?as=<이메일>로 해당 구성원 가장, 관리자 여부는 Member.Role로 결정 Co-Authored-By: Claude Opus 4.8 (1M context) --- internal/httpapi/auth.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/internal/httpapi/auth.go b/internal/httpapi/auth.go index b6d3d3c..5c0d653 100644 --- a/internal/httpapi/auth.go +++ b/internal/httpapi/auth.go @@ -41,10 +41,19 @@ func authMiddleware(devAuth bool, adminGroups []string) func(http.Handler) http. if devAuth { u = devUser // Local dev runs as a super-admin so every screen is reachable. - // Append ?as=user to any request to simulate a non-admin member. - u.IsSuperAdmin = r.URL.Query().Get("as") != "user" - if !u.IsSuperAdmin { + // ?as=user → 고정 데모 구성원(비관리자) + // ?as= → 그 이메일의 구성원으로 가장(로컬 멀티유저 테스트용; + // 관리자 여부는 그 Member.Role로 결정) + as := strings.TrimSpace(r.URL.Query().Get("as")) + switch { + case as == "": + u.IsSuperAdmin = true + case as == "user": u = User{ID: "u-member", Name: "김주임", Email: "member@special-partners.com", Role: "주임", Groups: []string{"user"}} + case strings.Contains(as, "@"): + u = User{ID: "u-" + as, Name: as, Email: as, Groups: []string{"user"}} + default: + u.IsSuperAdmin = true } } else { var ok bool