FastAPI + HTML + CSS + SQLite
- Role-Based Access Control (RBAC)
- Role identification (based on account role)
- Module permission checks in backend routes
- Permission authorization enforced per route/action
- Employee leave request submission + status tracking
- Supervisor approval/rejection
- Admin user management (CRUD) + reports
- Employee: can submit leave requests and view their own requests + status
- Supervisor: can view all requests and approve/reject them
- Admin: can manage users, view all requests, and view reports
| Module / Action | Employee | Supervisor | Admin |
|---|---|---|---|
| Submit leave request | ✅ | ❌ | ❌ |
| View own leave requests + status | ✅ | ❌ | ❌ |
| View all leave requests | ❌ | ✅ | ✅ |
| Approve / Reject requests | ❌ | ✅ | ❌ |
| Manage users (CRUD) | ❌ | ❌ | ✅ |
| View reports | ❌ | ❌ | ✅ |
- Employee submits a leave request (date range + reason). Status starts as Pending.
- Supervisor reviews all requests and approves/rejects.
- Employee checks their own requests and sees status updates.
- Admin manages users (CRUD) and views summary reports.
- Employee
GET /leave/new(submit request form)POST /leave/new(submit request)GET /leave/mine(view own requests)
- Supervisor/Admin
GET /leave(view all requests)POST /leave/{request_id}/decide(approve/reject)
- Admin only
GET /users(user CRUD: create/edit/delete)GET /reports(summary counts)
- Install dependencies:
py -m pip install -r requirements.txt
- Start app:
py -m uvicorn app:app --reload
- Open browser:
http://127.0.0.1:8000/login
- Passwords are stored as hashed values (salted SHA-256).
- admin / poiuytrewq
- employee / poiuytrewq
- supervisor / poiuytrewq
Database file is auto-created as leave_requests.db.
This system is a simple information system (IS) that demonstrates role-based access control:
-
Role Identification
- After login, the user's id is stored in the session (
request.session["user_id"]). - Each request resolves the current user (and their role) using
get_current_user().
- After login, the user's id is stored in the session (
-
Module Permission
- Permissions are defined in a role → module → actions map in
ROLE_PERMISSIONS(inapp.py). - Example:
employeehasleave.submitandleave.view_own, but notleave.view_all.
- Permissions are defined in a role → module → actions map in
-
Permission Authorization
- Protected routes call
ensure_permission(user, module, action)to enforce access. - Example: employees can only view
/leave/mine, while supervisors/admins can access/leaveand change statuses.
- Protected routes call