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开发, 事件响应管理, 全栈项目, 域名枚举, 多租户系统