최고관리자가 부여한 권한에 따라 메뉴 보여주기
This commit is contained in:
@@ -855,3 +855,95 @@ opacity-50 cursor-not-allowed"
|
||||
- 이모지 사용 금지 (명시적 요청 없이)
|
||||
- 심플하고 깔끔한 디자인 유지
|
||||
|
||||
---
|
||||
|
||||
## 사용자 관리 필수 규칙
|
||||
|
||||
### 최고 관리자(SUPER_ADMIN) 가시성 제한
|
||||
|
||||
**핵심 원칙**: 회사 관리자(COMPANY_ADMIN)와 일반 사용자(USER)는 **절대로** 최고 관리자(company_code = "*")를 볼 수 없어야 합니다.
|
||||
|
||||
#### 백엔드 구현 필수사항
|
||||
|
||||
모든 사용자 관련 API에서 다음 필터링 로직을 **반드시** 적용해야 합니다:
|
||||
|
||||
```typescript
|
||||
// 최고 관리자 필터링 (필수)
|
||||
if (req.user && req.user.companyCode !== "*") {
|
||||
// 최고 관리자가 아닌 경우, company_code가 "*"인 사용자는 제외
|
||||
whereConditions.push(`company_code != '*'`);
|
||||
logger.info("최고 관리자 필터링 적용", { userCompanyCode: req.user.companyCode });
|
||||
}
|
||||
```
|
||||
|
||||
**SQL 쿼리 예시:**
|
||||
```sql
|
||||
SELECT * FROM user_info
|
||||
WHERE 1=1
|
||||
AND company_code != '*' -- 최고 관리자 제외
|
||||
AND company_code = $1 -- 회사별 필터링
|
||||
```
|
||||
|
||||
#### 적용 대상 API (필수)
|
||||
|
||||
다음 사용자 관련 API에 최고 관리자 필터링을 **반드시** 적용해야 합니다:
|
||||
|
||||
1. **사용자 목록 조회** (`GET /api/admin/users`)
|
||||
- 사용자 관리 페이지
|
||||
- 권한 그룹 멤버 선택 (Dual List Box)
|
||||
- 검색/필터 결과
|
||||
|
||||
2. **사용자 검색** (`GET /api/admin/users/search`)
|
||||
- 자동완성/타입어헤드
|
||||
- 드롭다운 선택
|
||||
|
||||
3. **부서별 사용자 조회** (`GET /api/admin/users/by-department`)
|
||||
- 부서 필터링 시
|
||||
|
||||
4. **사용자 상세 조회** (`GET /api/admin/users/:userId`)
|
||||
- 최고 관리자의 상세 정보는 최고 관리자만 볼 수 있음
|
||||
|
||||
#### 프론트엔드 추가 보호 (권장)
|
||||
|
||||
백엔드에서 이미 필터링되지만, 프론트엔드에서도 추가 체크를 권장합니다:
|
||||
|
||||
```typescript
|
||||
// 컴포넌트에서 최고 관리자 제외
|
||||
const visibleUsers = users.filter(user => {
|
||||
// 최고 관리자만 최고 관리자를 볼 수 있음
|
||||
if (user.companyCode === "*" && !isSuperAdmin) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
});
|
||||
```
|
||||
|
||||
#### 예외 사항
|
||||
|
||||
- **최고 관리자(company_code = "*")** 는 모든 사용자(다른 최고 관리자 포함)를 볼 수 있습니다.
|
||||
- 최고 관리자는 다른 회사의 데이터도 조회할 수 있습니다.
|
||||
|
||||
#### 체크리스트
|
||||
|
||||
새로운 사용자 관련 기능 개발 시 다음을 확인하세요:
|
||||
|
||||
- [ ] `req.user.companyCode !== "*"` 체크 추가
|
||||
- [ ] `company_code != '*'` WHERE 조건 추가
|
||||
- [ ] 로깅으로 필터링 적용 여부 확인
|
||||
- [ ] 최고 관리자로 로그인하여 정상 작동 확인
|
||||
- [ ] 회사 관리자로 로그인하여 최고 관리자가 안 보이는지 확인
|
||||
|
||||
#### 관련 파일
|
||||
|
||||
- `backend-node/src/controllers/adminController.ts` - `getUserList()` 함수 참고
|
||||
- `backend-node/src/middleware/authMiddleware.ts` - 권한 체크
|
||||
- `frontend/components/admin/UserManagement.tsx` - 사용자 목록 UI
|
||||
- `frontend/components/admin/RoleDetailManagement.tsx` - 멤버 선택 UI
|
||||
|
||||
#### 보안 주의사항
|
||||
|
||||
- 클라이언트 측 필터링만으로는 부족합니다 (우회 가능).
|
||||
- 반드시 백엔드 SQL 쿼리에서 필터링해야 합니다.
|
||||
- API 응답에 최고 관리자 정보가 절대 포함되어서는 안 됩니다.
|
||||
- 로그에 필터링 여부를 기록하여 감사 추적을 남기세요.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user