feat: 사용자별 페이지 접근 권한 시스템 구현

- 기존 4단계 권한을 admin/user 2단계로 단순화
- 페이지별 세부 접근 권한 관리 시스템 추가
- 부적합 조회 시 일반 사용자는 본인 등록 건만 조회 가능하도록 제한
- 관리자 전용 전체 부적합 조회 API 추가 (/api/issues/admin/all)

Backend Changes:
- models.py: UserPagePermission 모델 추가, UserRole 단순화
- page_permissions.py: 페이지 권한 관리 API 라우터 추가
- auth.py: 사용자 목록 조회 및 비밀번호 초기화 API 추가
- issues.py: 권한별 부적합 조회 제한 로직 구현
- 마이그레이션: 010~012 권한 시스템 관련 DB 스키마 변경
This commit is contained in:
Hyungi Ahn
2025-10-25 08:59:52 +09:00
parent 41b557a709
commit b68bf78e40
8 changed files with 676 additions and 8 deletions

View File

@@ -6,7 +6,7 @@ from datetime import datetime
from database.database import get_db
from database.models import Issue, IssueStatus, User, UserRole
from database import schemas
from routers.auth import get_current_user
from routers.auth import get_current_user, get_current_admin
from services.file_service import save_base64_image, delete_file
router = APIRouter(prefix="/api/issues", tags=["issues"])
@@ -54,8 +54,30 @@ async def read_issues(
):
query = db.query(Issue)
# 모든 사용자가 모든 이슈를 조회 가능
# (필터링 제거 - 협업을 위해 모두가 볼 수 있어야 함)
# 권한별 조회 제한
if current_user.role == UserRole.admin:
# 관리자는 모든 이슈 조회 가능
pass
else:
# 일반 사용자는 본인이 등록한 이슈만 조회 가능
query = query.filter(Issue.reporter_id == current_user.id)
if status:
query = query.filter(Issue.status == status)
issues = query.offset(skip).limit(limit).all()
return issues
@router.get("/admin/all", response_model=List[schemas.Issue])
async def read_all_issues_admin(
skip: int = 0,
limit: int = 100,
status: Optional[IssueStatus] = None,
current_admin: User = Depends(get_current_admin),
db: Session = Depends(get_db)
):
"""관리자 전용: 모든 부적합 조회"""
query = db.query(Issue)
if status:
query = query.filter(Issue.status == status)
@@ -73,7 +95,12 @@ async def read_issue(
if not issue:
raise HTTPException(status_code=404, detail="Issue not found")
# 모든 사용자가 모든 이슈를 조회 가능 (협업을 위해)
# 권한별 조회 제한
if current_user.role != UserRole.admin and issue.reporter_id != current_user.id:
raise HTTPException(
status_code=403,
detail="본인이 등록한 부적합만 조회할 수 있습니다."
)
return issue