fix: 권한 시스템 일관성 개선 - 이슈 관리 권한 통일

🔐 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:
 수신함 권한이 있는 일반 사용자도 이슈 폐기/검토/상태변경 가능
 이슈 관리 권한이 있는 사용자도 모든 이슈 조회 가능
 권한 시스템 전체적으로 일관성 있게 통일
 사용자 관리만 관리자 전용으로 보안 유지
This commit is contained in:
Hyungi Ahn
2025-10-25 13:56:39 +09:00
parent f6ed6bd574
commit 492c31c248
2 changed files with 26 additions and 5 deletions

View File

@@ -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:

View File

@@ -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: