245 lines
11 KiB
Markdown
245 lines
11 KiB
Markdown
|
|
# 관리자단 기능 개발 설계서
|
||
|
|
|
||
|
|
> 웹 기능목록 CSV(관리자단 PWB-020000) 기준 · Auth 프로젝트와 동일한 방식으로 구현
|
||
|
|
|
||
|
|
**참조 CSV**: `docs/종량제 관련 자료/종량제 개발목록/종량제_개발목록_20260127(웹 기능목록) (1).csv`
|
||
|
|
**참조 구현**: `app/Controllers/Auth.php`, `app/Views/auth/`, `app/Models/MemberModel.php`, `app/Config/Routes.php`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Auth 프로젝트 구조 (참조 패턴)
|
||
|
|
|
||
|
|
### 1.1 디렉터리/파일 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
app/
|
||
|
|
├── Controllers/
|
||
|
|
│ └── Auth.php # showLoginForm, login, logout, showRegisterForm, register
|
||
|
|
├── Models/
|
||
|
|
│ ├── MemberModel.php # 회원 CRUD, findByLoginId
|
||
|
|
│ └── MemberLogModel.php # 로그인 이력
|
||
|
|
├── Views/
|
||
|
|
│ └── auth/
|
||
|
|
│ ├── login.php # 로그인 폼
|
||
|
|
│ └── register.php # 회원가입 폼
|
||
|
|
└── Config/
|
||
|
|
└── Routes.php # login, logout, register 라우트
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.2 네이밍 규칙
|
||
|
|
|
||
|
|
| 구분 | 규칙 | 예시 |
|
||
|
|
|------|------|------|
|
||
|
|
| 컨트롤러 | PascalCase, 단수/역할명 | `Auth`, `Home` |
|
||
|
|
| 메서드 | camelCase, 동사+명사 | `showLoginForm`, `login` |
|
||
|
|
| 뷰 폴더 | 컨트롤러명 소문자 | `auth/`, `home/` |
|
||
|
|
| 뷰 파일 | 소문자+언더스코어 | `login.php`, `register.php` |
|
||
|
|
| 라우트 URI | 소문자, 케밥 또는 경로 | `login`, `logout`, `register` |
|
||
|
|
| 모델 | PascalCase + Model | `MemberModel`, `MemberLogModel` |
|
||
|
|
|
||
|
|
### 1.3 라우트 패턴 (Auth 기준)
|
||
|
|
|
||
|
|
```php
|
||
|
|
// GET = 폼 표시 (showXxxForm 또는 index)
|
||
|
|
// POST = 처리 (login, register)
|
||
|
|
$routes->get('login', 'Auth::showLoginForm');
|
||
|
|
$routes->post('login', 'Auth::login');
|
||
|
|
$routes->get('logout', 'Auth::logout');
|
||
|
|
$routes->get('register', 'Auth::showRegisterForm');
|
||
|
|
$routes->post('register', 'Auth::register');
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.4 컨트롤러 메서드 패턴
|
||
|
|
|
||
|
|
- **폼 표시**: `showXxxForm()` → `return view('auth/xxx');`
|
||
|
|
- **처리**: `xxx()` → 유효성 검사 → Model 호출 → `redirect()->to(...)->with(...)`
|
||
|
|
- **유효성**: `$this->validate($rules, $messages)` 사용
|
||
|
|
- **에러 시**: `redirect()->back()->withInput()->with('errors', ...)`
|
||
|
|
|
||
|
|
### 1.5 뷰 공통 사항
|
||
|
|
|
||
|
|
- `base_url()`, `csrf_field()`, `esc()`, `old()` 사용
|
||
|
|
- 플래시: `session()->getFlashdata('success')`, `getFlashdata('error')`, `getFlashdata('errors')`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. 관리자단 기능 목록 (CSV 매핑)
|
||
|
|
|
||
|
|
| No | SFR 2레벨 | SFR 3레벨 | 기능 ID | 기능명 | 비고 |
|
||
|
|
|----|-----------|-----------|---------|--------|------|
|
||
|
|
| 4 | PWB-020100 | PWB-020101 | PWB-020101-001 | 사용자 권한 관리 | 권한 등록/수정/삭제, 역할별 설명 |
|
||
|
|
| 5 | PWB-020200 | PWB-020201 | PWB-020201-001 | 사용자 관리 | 사용자 등록/수정/삭제(삭제상태 5년 유지) |
|
||
|
|
| 6 | PWB-020300 | PWB-020301 | PWB-020301-001 | 사용자 로그인 이력 확인 | 기간 지정 조회 |
|
||
|
|
| 7 | PWB-020300 | PWB-020301 | PWB-020301-001 | 사용자 권한 승인 | 브라우저 회원가입 시 권한 승인 루틴 |
|
||
|
|
| 8 | PWB-020400 | PWB-020401 | PWB-020401-001 | 메뉴 관리 | 메뉴 등록/수정/삭제, "전체 메뉴" 시트 참고 |
|
||
|
|
| 9 | PWB-020400 | PWB-020401 | PWB-020401-001 | 메뉴 별 권한 설정 | 메뉴별 사용자 접근 권한 설정 |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. 관리자단 구현 설계 (Auth 방식 적용)
|
||
|
|
|
||
|
|
### 3.1 URL/라우트 구조
|
||
|
|
|
||
|
|
관리자 전용 prefix `admin` 사용, 인증 필터 적용 대상.
|
||
|
|
|
||
|
|
```
|
||
|
|
admin/ # 관리자 대시보드 (선택)
|
||
|
|
admin/users # 사용자 관리 목록 (GET)
|
||
|
|
admin/users/create # 사용자 등록 폼 (GET)
|
||
|
|
admin/users/store # 사용자 등록 처리 (POST)
|
||
|
|
admin/users/(:num)/edit # 사용자 수정 폼 (GET)
|
||
|
|
admin/users/(:num)/update # 사용자 수정 처리 (POST)
|
||
|
|
admin/users/(:num)/delete # 사용자 삭제(상태변경) (POST)
|
||
|
|
|
||
|
|
admin/roles # 사용자 권한 관리 (목록/등록/수정/삭제)
|
||
|
|
admin/roles/create
|
||
|
|
admin/roles/store
|
||
|
|
admin/roles/(:num)/edit
|
||
|
|
admin/roles/(:num)/update
|
||
|
|
admin/roles/(:num)/delete
|
||
|
|
|
||
|
|
admin/access # 사용자 접근 관리 (하위: 로그인이력, 권한승인)
|
||
|
|
admin/access/login-history # 로그인 이력 조회 (GET, 기간 조건)
|
||
|
|
admin/access/approvals # 권한 승인 대기 목록 (GET)
|
||
|
|
admin/access/approvals/(:num) # 권한 승인/반려 처리 (POST)
|
||
|
|
|
||
|
|
admin/menus # 메뉴 관리 (목록/등록/수정/삭제)
|
||
|
|
admin/menus/create
|
||
|
|
admin/menus/store
|
||
|
|
admin/menus/(:num)/edit
|
||
|
|
admin/menus/(:num)/update
|
||
|
|
admin/menus/(:num)/delete
|
||
|
|
admin/menus/permissions # 메뉴별 권한 설정
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.2 컨트롤러 구성 (Auth와 동일 패턴)
|
||
|
|
|
||
|
|
| 컨트롤러 | 파일 | 역할 | 주요 메서드 |
|
||
|
|
|----------|------|------|-------------|
|
||
|
|
| Admin\Dashboard | `Controllers/Admin/Dashboard.php` | 관리자 첫 화면 | `index()` |
|
||
|
|
| Admin\User | `Controllers/Admin/User.php` | 사용자 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)` |
|
||
|
|
| Admin\Role | `Controllers/Admin/Role.php` | 사용자 권한 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)` |
|
||
|
|
| Admin\Access | `Controllers/Admin/Access.php` | 접근 관리 | `loginHistory()`, `approvals()`, `approve($id)`, `reject($id)` |
|
||
|
|
| Admin\Menu | `Controllers/Admin/Menu.php` | 메뉴 관리 | `index()`, `create()`, `store()`, `edit($id)`, `update($id)`, `delete($id)`, `permissions()` |
|
||
|
|
|
||
|
|
- **목록/폼**: GET → `view('admin/xxx/yyy')`
|
||
|
|
- **저장/수정/삭제**: POST → `validate` → Model → `redirect()->to(...)->with(...)`
|
||
|
|
- **에러**: `redirect()->back()->withInput()->with('errors', ...)` (Auth와 동일)
|
||
|
|
|
||
|
|
### 3.3 모델 구성
|
||
|
|
|
||
|
|
| 모델 | 파일 | 테이블 | 비고 |
|
||
|
|
|------|------|--------|------|
|
||
|
|
| MemberModel | (기존) | member | 사용자 관리에서 재사용 |
|
||
|
|
| MemberLogModel | (기존) | member_log | 로그인 이력에서 재사용 |
|
||
|
|
| RoleModel | `Models/RoleModel.php` | role (신규) | 권한/역할 마스터 |
|
||
|
|
| MenuModel | `Models/MenuModel.php` | menu (신규) | 메뉴 마스터 |
|
||
|
|
| MenuPermissionModel | `Models/MenuPermissionModel.php` | menu_permission (신규) | 메뉴별 권한 |
|
||
|
|
|
||
|
|
- `member.mb_level`은 `Roles` 설정과 연동 유지.
|
||
|
|
- 권한 테이블(role)이 있으면 `member.mb_level`과 매핑 또는 확장.
|
||
|
|
|
||
|
|
### 3.4 뷰 디렉터리 구조
|
||
|
|
|
||
|
|
```
|
||
|
|
app/Views/
|
||
|
|
└── admin/
|
||
|
|
├── layout.php # 관리자 공통 레이아웃 (선택)
|
||
|
|
├── dashboard/
|
||
|
|
│ └── index.php
|
||
|
|
├── user/
|
||
|
|
│ ├── index.php # 목록
|
||
|
|
│ ├── create.php # 등록 폼
|
||
|
|
│ └── edit.php # 수정 폼
|
||
|
|
├── role/
|
||
|
|
│ ├── index.php
|
||
|
|
│ ├── create.php
|
||
|
|
│ └── edit.php
|
||
|
|
├── access/
|
||
|
|
│ ├── login_history.php # 로그인 이력 조회
|
||
|
|
│ └── approvals.php # 권한 승인 목록/처리
|
||
|
|
└── menu/
|
||
|
|
├── index.php
|
||
|
|
├── create.php
|
||
|
|
├── edit.php
|
||
|
|
└── permissions.php # 메뉴별 권한 설정
|
||
|
|
```
|
||
|
|
|
||
|
|
- 공통: `base_url()`, `csrf_field()`, `esc()`, `old()`, 플래시 메시지 (Auth와 동일).
|
||
|
|
|
||
|
|
### 3.5 인증/권한
|
||
|
|
|
||
|
|
- **관리자 구분**: `mb_level`이 `Roles::LEVEL_SUPER_ADMIN` 또는 `LEVEL_LOCAL_ADMIN`인 경우만 `admin/*` 접근 허용.
|
||
|
|
- **필터**: `app/Config/Filters.php`에 `adminAuth` 등 필터 등록 후, `admin/*` before에 적용.
|
||
|
|
- **필터 내부**: `session()->get('logged_in')` 및 `session()->get('mb_level')` 확인 후 미인증/비관리자면 `redirect()->to('login')` 또는 전용 에러 페이지.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Routes.php 등록 예시
|
||
|
|
|
||
|
|
```php
|
||
|
|
// 관리자단 (admin prefix, 인증 필터 적용)
|
||
|
|
$routes->group('admin', ['filter' => 'adminAuth'], static function ($routes) {
|
||
|
|
$routes->get('/', 'Admin\Dashboard::index');
|
||
|
|
$routes->get('users', 'Admin\User::index');
|
||
|
|
$routes->get('users/create', 'Admin\User::create');
|
||
|
|
$routes->post('users/store', 'Admin\User::store');
|
||
|
|
$routes->get('users/(:num)/edit', 'Admin\User::edit/$1');
|
||
|
|
$routes->post('users/(:num)/update', 'Admin\User::update/$1');
|
||
|
|
$routes->post('users/(:num)/delete', 'Admin\User::delete/$1');
|
||
|
|
|
||
|
|
$routes->get('roles', 'Admin\Role::index');
|
||
|
|
$routes->get('roles/create', 'Admin\Role::create');
|
||
|
|
$routes->post('roles/store', 'Admin\Role::store');
|
||
|
|
$routes->get('roles/(:num)/edit', 'Admin\Role::edit/$1');
|
||
|
|
$routes->post('roles/(:num)/update', 'Admin\Role::update/$1');
|
||
|
|
$routes->post('roles/(:num)/delete', 'Admin\Role::delete/$1');
|
||
|
|
|
||
|
|
$routes->get('access/login-history', 'Admin\Access::loginHistory');
|
||
|
|
$routes->get('access/approvals', 'Admin\Access::approvals');
|
||
|
|
$routes->post('access/approvals/(:num)', 'Admin\Access::approve/$1');
|
||
|
|
|
||
|
|
$routes->get('menus', 'Admin\Menu::index');
|
||
|
|
$routes->get('menus/create', 'Admin\Menu::create');
|
||
|
|
$routes->post('menus/store', 'Admin\Menu::store');
|
||
|
|
$routes->get('menus/(:num)/edit', 'Admin\Menu::edit/$1');
|
||
|
|
$routes->post('menus/(:num)/update', 'Admin\Menu::update/$1');
|
||
|
|
$routes->post('menus/(:num)/delete', 'Admin\Menu::delete/$1');
|
||
|
|
$routes->get('menus/permissions', 'Admin\Menu::permissions');
|
||
|
|
$routes->post('menus/permissions', 'Admin\Menu::savePermissions');
|
||
|
|
});
|
||
|
|
```
|
||
|
|
|
||
|
|
- `adminAuth`는 별도 필터 클래스에서 로그인 + 관리자 레벨 체크.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. 구현 순서 제안
|
||
|
|
|
||
|
|
1. **관리자 필터**
|
||
|
|
- `Filters.php`에 `adminAuth` 등록, 필터 클래스에서 `logged_in` + `mb_level` 검사.
|
||
|
|
2. **사용자 관리 (PWB-020201)**
|
||
|
|
- `Admin\User` 컨트롤러, `admin/user` 뷰, 기존 `MemberModel` 활용.
|
||
|
|
- 삭제는 상태값 변경, 5년 유지 정책은 정책/스케줄로 처리.
|
||
|
|
3. **사용자 권한 관리 (PWB-020101)**
|
||
|
|
- `Role` 테이블/모델 정비, `Admin\Role` 컨트롤러·뷰.
|
||
|
|
- `member.mb_level`과 역할 매핑 유지.
|
||
|
|
4. **사용자 접근 관리 (PWB-020301)**
|
||
|
|
- 로그인 이력: `Admin\Access::loginHistory`, 기간 조건, `MemberLogModel` 조회.
|
||
|
|
- 권한 승인: 대기 목록용 테이블/플로우 정한 뒤 `approvals`, `approve`/`reject` 구현.
|
||
|
|
5. **메뉴 관리 (PWB-020401)**
|
||
|
|
- `menu`, `menu_permission` 테이블, `MenuModel`, `MenuPermissionModel`.
|
||
|
|
- `Admin\Menu` CRUD + `permissions`/`savePermissions`.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. 정리
|
||
|
|
|
||
|
|
- **웹 기능목록 CSV**의 관리자단(No 4~9)을 **Auth와 같은 방식**으로 구현한다.
|
||
|
|
- **컨트롤러**: GET은 폼/목록, POST는 처리; 유효성 검사 후 Model 호출, 실패 시 `redirect()->back()->withInput()->with('errors', ...)`.
|
||
|
|
- **뷰**: `auth`와 동일하게 `base_url()`, `csrf_field()`, `esc()`, `old()`, 플래시 메시지 사용.
|
||
|
|
- **라우트**: `admin` 그룹 + 필터로 인증/권한 통제.
|
||
|
|
- **모델**: 기존 Member/MemberLog 활용하고, 권한·메뉴·메뉴권한은 신규 테이블/모델로 추가.
|
||
|
|
|
||
|
|
이 설계에 따라 단위 기능별로 Controller → Model → View → Route 순으로 구현하면 Auth와 일관된 관리자단을 만들 수 있다.
|