ChaudhariMahesh4701/DMImpact_Multi-Tenant_Task
GitHub: ChaudhariMahesh4701/DMImpact_Multi-Tenant_Task
基于 Angular 和 Spring Boot 构建的多租户事件响应平台,提供告警接报、事件生命周期管理、RBAC 权限控制和严格的租户级数据隔离。
Stars: 0 | Forks: 0
# DMimpact 多租户事件响应平台
为 DMimpact 编程挑战赛构建的、基于 Angular 和 Spring Boot 的全栈事件管理平台。
## 技术栈
- 前端:Angular 18 独立组件、路由守卫、HTTP 拦截器、强类型 API 服务。
- 后端:Spring Boot 3、Java 17、Spring Security、JWT、Spring Data JPA、H2 演示数据库。
- API 文档:Swagger/OpenAPI,访问地址为 `http://localhost:8080/swagger-ui.html`。
## 仓库结构
```
.
├── backend
│ └── src/main/java/com/dmimpact/incident
│ ├── alert # Alert intake and triage
│ ├── audit # Immutable tenant-scoped activity history
│ ├── auth # Login, JWT creation, current user context
│ ├── common # Shared API errors and exceptions
│ ├── config # Security, OpenAPI, MVC, seed data
│ ├── incident # Incident lifecycle, comments, filters, stats
│ ├── tenant # Tenant entity/repository
│ └── user # Users, roles, tenant team directory
└── frontend
└── src/app
├── core # Auth state, guards, interceptor, typed API client
└── features # Login, layout, dashboard, incidents
```
## 本地设置
启动后端:
```
mvn -pl backend spring-boot:run
```
启动前端:
```
cd frontend
npm install
npm start
```
打开 `http://localhost:4200`。
如果你的终端在 `PATH` 中优先使用了旧版 Homebrew Node,请先使用 NVM Node:
```
export PATH="$HOME/.nvm/versions/node/v22.21.0/bin:/usr/bin:/bin:/usr/sbin:/sbin"
npm install
```
该项目还包含 `frontend/.npmrc`,其中设置了 `script-shell=/bin/sh`,以避免出现诸如 `spawn sh ENOENT` 的 npm 生命周期脚本失败问题。
## 演示账号
所有演示账号均使用密码 `Password123!`。
| 租户 | 邮箱 | 角色 |
| --- | --- | --- |
| `acme` | `admin@acme.test` | Admin |
| `acme` | `manager@acme.test` | Manager |
| `acme` | `user@acme.test` | User |
| `globex` | `admin@globex.test` | Admin |
## 已实现需求
- 包含租户 ID、租户 Slug、用户 ID、邮箱和角色声明的 JWT 身份验证。
- 针对Admin、Manager 和 User 的 RBAC。
- 针对用户、事件、警报、评论和审计日志的租户隔离后端设计。
- 事件的创建、更新、分配、状态更改、解决、评论、搜索和过滤。
- 警报接收和分类端点。
- 针对登录、警报创建、事件创建、分配、更新、评论和解决的审计日志记录。
- 具有加载中、空状态和错误状态的响应式 Angular 仪表盘。
- REST API 验证和一致的错误处理。
- Swagger/OpenAPI 文档。
- 证明跨租户事件查找已被阻止的集成测试。
## 租户隔离设计
客户端绝不会为受保护的操作发送受信任的租户 ID。登录后,后端通过 `SecurityUser` 从已签名的 JWT 中提取租户上下文。然后,服务将 `currentUser.tenantId()` 传递给存储库方法,例如 `findByTenantIdAndId`、`findByTenantIdOrderByNameAsc` 以及经过租户过滤的 JPA specifications。
这意味着来自租户 A 的已验证用户即使知道或猜出租户 B 的实体 UUID,也依然会收到 `404` 错误,因为查找谓词始终同时包含 `tenant_id` 和实体 ID。
## 数据库架构
演示使用 H2 和由 JPA 生成的数据表:
- `tenants`
- `users`
- `alerts`
- `incidents`
- `incident_comments`
- `audit_logs`
生产环境将使用 PostgreSQL,并采用相同的租户 ID 索引策略。重要索引包括租户/状态、租户/严重程度、租户/创建时间、租户/邮箱以及租户/实体审计查找。
## 常用 API 端点
- `POST /api/auth/login`
- `POST /api/auth/register`
- `GET /api/auth/me`
- `GET /api/incidents`
- `POST /api/incidents`
- `GET /api/incidents/{incidentId}`
- `PUT /api/incidents/{incidentId}`
- `POST /api/incidents/{incidentId}/comments`
- `GET /api/incidents/stats`
- `GET /api/alerts`
- `POST /api/alerts`
- `PATCH /api/alerts/{alertId}/status`
- `GET /api/audit-logs`
- `GET /api/users`
## 验证
```
mvn -q -pl backend test
cd frontend
npm run build
```
## 权衡
- 使用 H2 是为了方便审查人员;部署环境中应使用 PostgreSQL。
- JWT 密钥配置了演示回退值。生产环境必须设置 `APP_JWT_SECRET`。
- 实时更新被记录为一种扩展路径;MVP 版本采用刷新机制和对 REST 轮询友好的端点。
- 用户管理 CRUD 被刻意限制为预设的演示用户,以确保核心事件工作流保持专注。
## 通俗易懂的用户指南
有关如何注册、登录和使用平台的简单指南,请参阅 [PLATFORM_GUIDE.md](PLATFORM_GUIDE.md)。
标签:Angular, Grype, Spring Boot, Syscall, Web开发, 事件响应管理, 全栈项目, 域名枚举, 多租户系统