cntzemir/secure-auth-admin-demo
GitHub: cntzemir/secure-auth-admin-demo
这是一个基于Node.js构建的教学演示项目,展示了如何在Web应用中实施会话认证、RBAC、速率限制及审计日志等关键安全防护措施。
Stars: 0 | Forks: 0
安全认证与管理后台演示
使用 Node.js、Express 和 EJS 构建的注重安全性的认证演示。
旨在在一个简洁的 Web 应用程序工作流中演示 **基于会话的认证**、**RBAC**、**审计日志**、
**CSRF 防护**、**速率限制** 和 **临时账户锁定**。
概述 •
项目亮点 •
功能 •
安全控制 •
截图 •
本地运行 •
文档
## 项目概述
本项目旨在展示一个小型 Web 应用程序可以在设计之初就做出**安全感知的决策**,而不是事后才添加安全措施。
除了关注表单和页面流程,本应用程序强调:
- **认证**:包含注册、基于会话的登录和登出
- **授权**:具有后端强制执行的角色分离
- **滥用减少**:通过速率限制和临时锁定规则
- **可追溯性**:通过审计日志和近期活动视图
- **防御性 UX**:提供通用的认证错误和安全的重置响应
- **管理端监控**:检测可疑模式、筛选审计审查以及锁定可见性
它被定位为一个**防御性软件工程演示**,而非生产级 SaaS 产品。
## 项目的重要性
许多学生认证演示仅停留在基本登录和角色检查。本项目旨在展示一种更具防御性的方法:后端强制授权、滥用减少、审计可见性,以及对安全敏感行为的可预测处理。
目标不仅仅是认证用户,还要使与认证相关的行为可审查、可追溯,并在滥用场景下更加安全。
## 项目亮点
- 超越了简单的登录/注册 CRUD 流程
- 展示了**安全推理**,而不仅仅是 UI 实现
- 清晰地分离了**认证**和**授权**
- 包含对认证事件、可疑模式和锁定账户的**管理端可见性**
- 文档详尽,像是一个经过精心设计的项目,而不仅仅是快速编写的代码
## 架构概览
Browser (浏览器)
-> Express routes (路由)
-> auth / middleware / validation (认证 / 中间件 / 验证)
-> controllers / services (控制器 / 服务)
-> session store / JSON data store (会话存储 / JSON 数据存储)
-> admin monitoring views / audit log (管理监控视图 / 审计日志)
## 功能集
### 认证流程
- 用户注册
- 登录 / 登出
- 基于会话的认证
- 模拟忘记密码请求流程
- 通用认证错误处理
### 用户视图
- 用户仪表板
- 个人资料页
- 近期活动页
### 管理员视图
- 管理员概览仪表板
- 用户页
- 审计日志页
- 锁定账户页
### 滥用处理与可见性
- 失败登录跟踪
- 多次失败后的临时账户锁定
- 专用的 `account_locked` 审计事件
- 认证路由上的速率限制
- 包含状态、事件类型、路由、IP 和备注的审计跟踪
- 管理日志视图中的快速筛选
- 管理仪表板上的高优先级和可疑事件审查
## 安全控制
| 控制手段 | 功能说明 |
| --- | --- |
| **基于会话的认证** | 将认证状态保留在服务器端,以便于控制和失效 |
| **RBAC** | 在后端限制管理员路由,而不仅仅是在 UI 中 |
| **密码哈希** | 使用 `bcryptjs` 安全地存储密码 |
| **速率限制** | 减少认证路由上的重复登录滥用 |
| **临时锁定** | 在多次失败尝试后锁定账户 |
| **CSRF 防护** | 保护状态更改表单,包括登出和管理员解锁操作 |
| **服务端验证** | 在后端验证认证表单输入 |
| **通用认证错误** | 减少凭据枚举信号 |
| **审计日志** | 保留认证和管理相关事件的可见性 |
## 考虑到的威胁
本演示将认证、授权、验证和审计可见性作为独立的关注点,以便审查者面对的安全决策易于检查。
- 暴力破解登录尝试
- 凭据猜测和重复认证滥用
- 对仅限管理员路由的未授权访问
- 缺乏反 CSRF 控制的状态更改请求
- 认证表单上的弱验证
- 通过登录响应泄露敏感信息
- 缺乏对可疑行为的可追溯性
## 截图
### 公共视图和用户视图
| 登录 | 用户仪表板 |
| --- | --- |
|  |  |
### 管理员监控视图
| 管理员概览 | 近期活动 |
| --- | --- |
|  |  |
## | 审计日志 | 可疑事件示例 |
| --- | --- |
|  |  |
## 请求 / 响应思维模式
本项目有意将与认证相关的端点视为高价值表面:
- 认证路由受到速率限制
- 敏感响应已通用化
- 状态更改表单受 CSRF 保护
- 可疑或与安全相关的操作会被记录
- 管理员页面受后端保护并进行角色检查
## 技术栈
- **Runtime (运行时):** Node.js
- **Framework (框架):** Express
- **View engine (视图引擎):** EJS
- **Session management (会话管理):** `express-session`
- **Password hashing (密码哈希):** `bcryptjs`
- **Security headers (安全头):** `helmet`
- **Rate limiting (速率限制):** `express-rate-limit`
- **Persistence (持久化):** 便携式文件支持的 JSON 存储
## 架构摘要
```
src/
├── config/ # session and data-store setup
├── controllers/ # route handlers
├── middleware/ # auth, role, csrf, validation, rate limit
├── routes/ # public, user, and admin routes
├── services/ # auth, audit, user business logic
├── utils/ # password, request, and time helpers
├── validators/ # auth flow validation
├── views/ # EJS templates for public, user, and admin pages
└── public/ # styles and static assets
```
## 本地运行
### Windows PowerShell
```
npm install
Copy-Item .env.example .env
npm run seed
npm start
```
### macOS / Linux
```
npm install
cp .env.example .env
npm run seed
npm start
```
打开: `http://localhost:3000`
## 初始化后的默认管理员账户
- **Email:** `admin@example.com`
- **Password:** `Admin123!`
这是一个仅用于本地测试的**种子本地演示账户**。
## 建议的演示流程
1. 初始化默认管理员账户
2. 通过 `/register` 注册一个新普通用户
3. 使用该用户登录并查看 `/dashboard`、`/profile` 和 `/activity`
4. 触发重复失败的登录以测试锁定行为
5. 以管理员身份登录并打开:
- `/admin`
- `/admin/users`
- `/admin/logs`
- `/admin/locked-accounts`
6. 确认注册、登录、失败、锁定、登出和管理员审查操作都反映在审计跟踪中
## 文档
- [架构](docs/architecture.md)
- [安全决策](docs/security-decisions.md)
- [威胁模型](docs/threat-model.md)
- [API 路由](docs/api-routes.md)
- [测试清单](docs/testing-checklist.md)
- [截图清单](docs/screenshots-checklist.md)
- [GitHub 发布清单](docs/github-release-checklist.md)
## 已知局限性
- 这是一个教育演示,并非生产环境部署
- 项目目前使用便携式 JSON 存储而非 SQLite/PostgreSQL
- 密码重置是模拟流程,不会发送真实邮件
- 当前版本未实现 MFA
- 检测逻辑故意保持轻量级且基于规则
- 会话存储适用于本地/演示使用,而非生产规模
## 下一版本目标
- 将持久化从 JSON 存储迁移到 SQLite 或 PostgreSQL
- 增加更强的可疑事件评分和筛选导出
- 引入 MFA 或基于 TOTP 的第二因子支持
- 扩展用于账户恢复和解锁审查的管理员工具
- 添加针对认证、锁定和审计可见性的集成测试
- 改进审查者演示数据和重置工具
## 分享前的仓库清单
- [ ] `.env` 未提交
- [ ] 运行时数据文件未提交
- [ ] 截图已放置在 `screenshots/` 中
- [ ] README 图片在 GitHub 上正确渲染
- [ ] 注册、登录、登出、锁定和管理员视图已再次测试
- [ ] GitHub 上的 About 部分和主题已填写
docs: 在 README 顶部附近添加审查者摘要
标签:CSRF防护, EJS, Express, GNU通用公共许可证, MITM代理, Node.js, RBAC, Streamlit, StruQ, Web安全, XML 请求, 中间件, 前端安全, 后端开发, 基于会话的认证, 安全开发, 安全演示, 审计日志, 授权管理, 最佳实践, 权限控制, 管理面板, 网络安全, 蓝队分析, 访问控制, 账户锁定, 隐私保护