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:
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user