From 492c31c2484b17774a92aae511cb8800eb5e5bdf Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sat, 25 Oct 2025 13:56:39 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EA=B6=8C=ED=95=9C=20=EC=8B=9C=EC=8A=A4?= =?UTF-8?q?=ED=85=9C=20=EC=9D=BC=EA=B4=80=EC=84=B1=20=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?-=20=EC=9D=B4=EC=8A=88=20=EA=B4=80=EB=A6=AC=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit πŸ” Permission System Consistency: - μˆ˜μ‹ ν•¨/관리함/폐기함 κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžλŠ” λͺ¨λ“  이슈 쑰회/처리 κ°€λŠ₯ - κΈ°μ‘΄: μ‘°νšŒλŠ” κ΄€λ¦¬μžλ§Œ, μ²˜λ¦¬λŠ” κΆŒν•œ μ‚¬μš©μž β†’ 일관성 λΆ€μ‘± - κ°œμ„ : μ‘°νšŒμ™€ 처리 λͺ¨λ‘ λ™μΌν•œ κΆŒν•œ 체계 적용 πŸ“‹ Issues API Updates: - GET /api/issues/admin/all: get_current_admin β†’ get_current_user + κΆŒν•œ 체크 - 이슈 관리 κ΄€λ ¨ νŽ˜μ΄μ§€ κΆŒν•œ 확인 (issues_manage, issues_inbox, issues_management, issues_archive) - κ΄€λ¦¬μžμ΄κ±°λ‚˜ ν•΄λ‹Ή κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžλ§Œ μ ‘κ·Ό κ°€λŠ₯ πŸ”„ Inbox API Updates: - λͺ¨λ“  μˆ˜μ‹ ν•¨ μ›Œν¬ν”Œλ‘œμš° API: get_current_admin β†’ get_current_user + νŽ˜μ΄μ§€ κΆŒν•œ 체크 - dispose_issue: μˆ˜μ‹ ν•¨ κΆŒν•œ 확인 μΆ”κ°€ - review_issue: μˆ˜μ‹ ν•¨ κΆŒν•œ 확인 μΆ”κ°€ - update_issue_status: μˆ˜μ‹ ν•¨ κΆŒν•œ 확인 μΆ”κ°€ 🎯 Permission Logic: - μ‚¬μš©μž 관리 (auth.py): κ΄€λ¦¬μž μ „μš© μœ μ§€ (λ³΄μ•ˆμƒ μ€‘μš”) - 이슈 관리: κΆŒν•œ λΆ€μ—¬λœ μ‚¬μš©μž λͺ¨λ‘ μ ‘κ·Ό κ°€λŠ₯ - μˆ˜μ‹ ν•¨ μ›Œν¬ν”Œλ‘œμš°: κΆŒν•œ λΆ€μ—¬λœ μ‚¬μš©μž λͺ¨λ‘ μ ‘κ·Ό κ°€λŠ₯ πŸ”§ Technical Implementation: - check_page_access() ν•¨μˆ˜λ‘œ νŽ˜μ΄μ§€λ³„ κΆŒν•œ 체크 - κ΄€λ¦¬μžλŠ” μžλ™μœΌλ‘œ λͺ¨λ“  κΆŒν•œ 보유 - 일반 μ‚¬μš©μžλŠ” κ°œλ³„ νŽ˜μ΄μ§€ κΆŒν•œ 확인 πŸš€ User Experience: - κΆŒν•œμ΄ μžˆλŠ” 일반 μ‚¬μš©μžλ„ μˆ˜μ‹ ν•¨μ—μ„œ 이슈 처리 κ°€λŠ₯ - μΌκ΄€λœ κΆŒν•œ μ²΄κ³„λ‘œ μ‚¬μš©μž ν˜Όλž€ λ°©μ§€ - κ΄€λ¦¬μžμ™€ κΆŒν•œ μ‚¬μš©μž λ™μΌν•œ κΈ°λŠ₯ 제곡 Expected Result: βœ… μˆ˜μ‹ ν•¨ κΆŒν•œμ΄ μžˆλŠ” 일반 μ‚¬μš©μžλ„ 이슈 폐기/κ²€ν† /μƒνƒœλ³€κ²½ κ°€λŠ₯ βœ… 이슈 관리 κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžλ„ λͺ¨λ“  이슈 쑰회 κ°€λŠ₯ βœ… κΆŒν•œ μ‹œμŠ€ν…œ μ „μ²΄μ μœΌλ‘œ 일관성 있게 톡일 βœ… μ‚¬μš©μž κ΄€λ¦¬λ§Œ κ΄€λ¦¬μž μ „μš©μœΌλ‘œ λ³΄μ•ˆ μœ μ§€ --- backend/routers/inbox.py | 16 +++++++++++++--- backend/routers/issues.py | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/backend/routers/inbox.py b/backend/routers/inbox.py index b57be18..b693ca1 100644 --- a/backend/routers/inbox.py +++ b/backend/routers/inbox.py @@ -10,6 +10,7 @@ from database.schemas import ( IssueStatusUpdateRequest, ModificationLogEntry ) from routers.auth import get_current_user, get_current_admin +from routers.page_permissions import check_page_access router = APIRouter(prefix="/api/inbox", tags=["inbox"]) @@ -40,12 +41,15 @@ async def get_inbox_issues( async def dispose_issue( issue_id: int, disposal_request: IssueDisposalRequest, - current_user: User = Depends(get_current_admin), # κ΄€λ¦¬μžλ§Œ 폐기 κ°€λŠ₯ + current_user: User = Depends(get_current_user), # μˆ˜μ‹ ν•¨ κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μž db: Session = Depends(get_db) ): """ 뢀적합 폐기 처리 """ + # μˆ˜μ‹ ν•¨ νŽ˜μ΄μ§€ κΆŒν•œ 확인 + if not check_page_access(current_user.id, 'issues_inbox', db): + raise HTTPException(status_code=403, detail="μˆ˜μ‹ ν•¨ μ ‘κ·Ό κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.") # 뢀적합 쑰회 issue = db.query(Issue).filter(Issue.id == issue_id).first() if not issue: @@ -118,12 +122,15 @@ async def dispose_issue( async def review_issue( issue_id: int, review_request: IssueReviewRequest, - current_user: User = Depends(get_current_admin), # κ΄€λ¦¬μžλ§Œ κ²€ν†  κ°€λŠ₯ + current_user: User = Depends(get_current_user), # μˆ˜μ‹ ν•¨ κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μž db: Session = Depends(get_db) ): """ 뢀적합 κ²€ν†  및 μˆ˜μ • """ + # μˆ˜μ‹ ν•¨ νŽ˜μ΄μ§€ κΆŒν•œ 확인 + if not check_page_access(current_user.id, 'issues_inbox', db): + raise HTTPException(status_code=403, detail="μˆ˜μ‹ ν•¨ μ ‘κ·Ό κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.") # 뢀적합 쑰회 issue = db.query(Issue).filter(Issue.id == issue_id).first() if not issue: @@ -215,12 +222,15 @@ async def review_issue( async def update_issue_status( issue_id: int, status_request: IssueStatusUpdateRequest, - current_user: User = Depends(get_current_admin), # κ΄€λ¦¬μžλ§Œ μƒνƒœ λ³€κ²½ κ°€λŠ₯ + current_user: User = Depends(get_current_user), # μˆ˜μ‹ ν•¨ κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μž db: Session = Depends(get_db) ): """ 뢀적합 μ΅œμ’… μƒνƒœ κ²°μ • (μ§„ν–‰ 쀑 / μ™„λ£Œ) """ + # μˆ˜μ‹ ν•¨ νŽ˜μ΄μ§€ κΆŒν•œ 확인 + if not check_page_access(current_user.id, 'issues_inbox', db): + raise HTTPException(status_code=403, detail="μˆ˜μ‹ ν•¨ μ ‘κ·Ό κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.") # 뢀적합 쑰회 issue = db.query(Issue).filter(Issue.id == issue_id).first() if not issue: diff --git a/backend/routers/issues.py b/backend/routers/issues.py index 2cc61f1..f812072 100644 --- a/backend/routers/issues.py +++ b/backend/routers/issues.py @@ -73,10 +73,21 @@ async def read_all_issues_admin( skip: int = 0, limit: int = 100, status: Optional[IssueStatus] = None, - current_admin: User = Depends(get_current_admin), + current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): - """κ΄€λ¦¬μž μ „μš©: λͺ¨λ“  뢀적합 쑰회""" + """이슈 관리 κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μž: λͺ¨λ“  뢀적합 쑰회""" + # 이슈 관리 νŽ˜μ΄μ§€ κΆŒν•œ 확인 (관리함, 폐기함 λ“±μ—μ„œ μ‚¬μš©) + from routers.page_permissions import check_page_access + + # κ΄€λ¦¬μžμ΄κ±°λ‚˜ 이슈 관리 κΆŒν•œμ΄ μžˆλŠ” μ‚¬μš©μžλ§Œ μ ‘κ·Ό κ°€λŠ₯ + if (current_user.role != 'admin' and + not check_page_access(current_user.id, 'issues_manage', db) and + not check_page_access(current_user.id, 'issues_inbox', db) and + not check_page_access(current_user.id, 'issues_management', db) and + not check_page_access(current_user.id, 'issues_archive', db)): + raise HTTPException(status_code=403, detail="이슈 관리 κΆŒν•œμ΄ μ—†μŠ΅λ‹ˆλ‹€.") + query = db.query(Issue) if status: