This commit is contained in:
@@ -30,7 +30,9 @@ Giao diện web trên robot: **responsive** (PC, tablet, portrait/landscape). Tr
|
||||
|
||||
### 2.1 Signing in
|
||||
|
||||
#### Luồng truy cập
|
||||
> **Test3:** tính năng đã triển khai — xem [Test3 — Signing in](#test3--signing-in-đã-triển-khai).
|
||||
|
||||
#### Luồng truy cập (MiR)
|
||||
|
||||
```
|
||||
Thiết bị → kết nối mạng robot → trình duyệt → trang Sign in → shell app (Dashboard / Setup / …)
|
||||
@@ -87,51 +89,143 @@ Admin có thể tạo thêm user group (ví dụ `Operators`) và gán quyền t
|
||||
- Không nên nhiều người dùng chung một account.
|
||||
- SW mới (~2023): **auto sign-out** theo user group; MiR Fleet hỗ trợ **OAuth 2.0 / OpenID Connect**.
|
||||
|
||||
#### Thiết kế web tương tự MiR (gợi ý Test3)
|
||||
#### Test3 — Signing in (đã triển khai)
|
||||
|
||||
**UI trang Sign in**
|
||||
Tính năng đăng nhập theo MiR §2.1 đã tích hợp vào `lidar_manager_web`. Toàn bộ API (trừ health/login/logout) yêu cầu session; UI bị chặn cho đến khi đăng nhập thành công.
|
||||
|
||||
##### Luồng người dùng
|
||||
|
||||
```
|
||||
Trình duyệt → / (trang Sign in)
|
||||
→ POST /api/auth/login (password hoặc PIN)
|
||||
→ Cookie lm_session + shell app (Dashboard / Cấu hình / Missions / Tích hợp)
|
||||
→ Menu user (góc phải): đổi mật khẩu, đăng xuất
|
||||
```
|
||||
|
||||
- Static (`www/`) phục vụ công khai để tải trang login.
|
||||
- `auth.js` gọi `GET /api/auth/me` khi mở trang; session hợp lệ thì vào app ngay.
|
||||
- `app.js`, `missions.js`, `dashboard.js`, `integrations.js` chỉ khởi động sau sự kiện `lm:auth-ready`.
|
||||
- API mission queue và các endpoint khác **không** được gọi trước khi đăng nhập.
|
||||
|
||||
##### Giao diện web (MiR-style)
|
||||
|
||||
| Thành phần | Mô tả |
|
||||
|------------|--------|
|
||||
| Layout | Full-screen, logo, form giữa màn hình |
|
||||
| Tabs | `Username & password` \| `PIN code` |
|
||||
| Nút | **Sign in** (MiR dùng thuật ngữ này) |
|
||||
| Responsive | Input/nút lớn, dễ chạm trên tablet sàn |
|
||||
| Nền | Xanh `#3d6cb3`, full-screen |
|
||||
| Header | Tên robot (`RobotApp`) + «Chọn cách đăng nhập» + 2 tab |
|
||||
| Tab **Tên đăng nhập và mật khẩu** | 2 cột: hướng dẫn trái, form phải; nút xanh «Đăng nhập» |
|
||||
| Tab **Mã PIN** | Trái: hướng dẫn + 4 ô vuông (•); phải: keypad 1–9, 0, ✕ |
|
||||
| PIN | Tự đăng nhập khi đủ 4 số; hỗ trợ bàn phím vật lý |
|
||||
| Sau login | Menu user topbar; ẩn/vô hiệu menu theo quyền read-only |
|
||||
|
||||
**Kiến trúc**
|
||||
File: `www/index.html`, `www/auth.js`, `www/style.css`.
|
||||
|
||||
```
|
||||
Sign-in (public) → POST /api/auth/login → session/JWT
|
||||
→ Shell app + route guard theo permissions
|
||||
→ API middleware (read/write từng module)
|
||||
##### Tài khoản mặc định
|
||||
|
||||
Tự tạo lần đầu trong `data/auth.json` (cùng thư mục `state.json`):
|
||||
|
||||
| Username | Password | User group | Ghi chú |
|
||||
|----------|----------|------------|---------|
|
||||
| `Admin` | `admin` | Administrators | Full quyền |
|
||||
| `User` | `user` | Users | Dashboard write; phần còn lại read |
|
||||
| `Distributor` | `distributor` | Distributors | Full quyền |
|
||||
|
||||
- Username đăng nhập **không phân biệt hoa thường** (`admin` = `Admin`).
|
||||
- **PIN:** không có mã mặc định (giống MiR). Chỉ nhóm **Users** (`allow_pin: true`); admin gán qua API.
|
||||
|
||||
##### User groups và permissions
|
||||
|
||||
Credentials → **user**; quyền → **group**. Module: `dashboard`, `config`, `missions`, `integrations`, `users` — giá trị `none` | `read` | `write`.
|
||||
|
||||
| Group | PIN | dashboard | config | missions | integrations | users |
|
||||
|-------|-----|-----------|--------|----------|--------------|-------|
|
||||
| Distributors | Không | write | write | write | write | write |
|
||||
| Administrators | Không | write | write | write | write | write |
|
||||
| Users | Sau khi gán | write | read | read | read | none |
|
||||
|
||||
| Group | Menu UI |
|
||||
|-------|---------|
|
||||
| Users | Dashboard + xem Cấu hình/Missions/Tích hợp (nút ghi read-only) |
|
||||
| Administrators / Distributors | Toàn bộ menu; quản lý user qua API |
|
||||
|
||||
##### Session và middleware
|
||||
|
||||
| Cơ chế | Chi tiết |
|
||||
|--------|----------|
|
||||
| Session | Server-side; mất khi restart process |
|
||||
| Cookie | `lm_session=<token>; HttpOnly; SameSite=Lax` |
|
||||
| Header | `Authorization: Bearer <token>` |
|
||||
| Middleware | `AuthService::preRoute` trên `/api/*` |
|
||||
| Public | `GET /api/health`, `POST /api/auth/login`, `POST /api/auth/logout`, `OPTIONS` |
|
||||
| Dev | `LM_AUTH_DISABLED=1` tắt auth |
|
||||
|
||||
**API → module** (kiểm tra read/write):
|
||||
|
||||
| Module | Prefix |
|
||||
|--------|--------|
|
||||
| config | `/api/lidars`, `/api/imus`, `/api/layouts`, `/api/state`, … |
|
||||
| missions | `/api/missions`, `/api/mission_queue` |
|
||||
| integrations | `/api/triggers`, `/api/schedules`, `/api/fleet`, `/api/modbus`, `/api/v2.0.0/` |
|
||||
| users | `/api/users`, `/api/user_groups` |
|
||||
|
||||
##### REST API
|
||||
|
||||
| Method | Endpoint | Auth | Mô tả |
|
||||
|--------|----------|------|--------|
|
||||
| POST | `/api/auth/login` | Public | `{ username, password }` hoặc `{ pin }` |
|
||||
| POST | `/api/auth/logout` | Public | Xóa session + cookie |
|
||||
| GET | `/api/auth/me` | Session | User, group, permissions |
|
||||
| PUT | `/api/auth/password` | Session | Đổi mật khẩu |
|
||||
| GET | `/api/user_groups` | users read | Danh sách nhóm |
|
||||
| GET | `/api/users` | users read | Danh sách user |
|
||||
| POST | `/api/users` | users write | Tạo user |
|
||||
| PUT | `/api/users/:id` | users write | Sửa user / gán PIN (`pin: null` = xóa) |
|
||||
| DELETE | `/api/users/:id` | users write | Xóa user |
|
||||
|
||||
**Ví dụ login + gán PIN**
|
||||
|
||||
```bash
|
||||
curl -c c.txt -X POST http://localhost:8080/api/auth/login \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"username":"Admin","password":"admin"}'
|
||||
|
||||
curl -b c.txt -X PUT http://localhost:8080/api/users/user_operator \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"pin":"1234"}'
|
||||
```
|
||||
|
||||
**API gợi ý**
|
||||
##### Lưu trữ và mã nguồn
|
||||
|
||||
| Method | Endpoint | Mô tả |
|
||||
|--------|----------|--------|
|
||||
| POST | `/api/auth/login` | `{ username, password }` hoặc `{ pin }` |
|
||||
| POST | `/api/auth/logout` | Hủy session |
|
||||
| GET | `/api/auth/me` | User, group, permissions (ẩn menu) |
|
||||
| PUT | `/api/auth/password` | User tự đổi password |
|
||||
| CRUD | `/api/users`, `/api/user_groups` | Cần quyền admin |
|
||||
| Thành phần | Vị trí |
|
||||
|------------|--------|
|
||||
| Dữ liệu | `data/auth.json` — groups, users (hash + salt) |
|
||||
| Backend | `src/auth/auth_service.cpp`, `src/util/crypto_util.cpp`, `src/app/lidar_manager_app.cpp` |
|
||||
| Frontend | `www/auth.js`, `www/index.html`, `www/style.css` |
|
||||
| Test | `scripts/test/smoke.sh`, `tests/test_api_integration.py` |
|
||||
|
||||
**Phân quyền UI sau login (ví dụ)**
|
||||
Hash: SHA-256 + salt (`sha256(salt:password)` / `sha256(salt:pin:pin)`).
|
||||
|
||||
| Group | Truy cập |
|
||||
|-------|----------|
|
||||
| User / Operator | Dashboard (mission, queue, pause/cancel) |
|
||||
| Administrator | + Setup (Missions, Maps, Tích hợp, Cấu hình) |
|
||||
| Distributor | + Users / User groups |
|
||||
##### Kiểm thử và vận hành
|
||||
|
||||
#### Test3 hiện tại
|
||||
```bash
|
||||
./scripts/lm.sh test run # smoke tự login Admin; pytest test_auth_*
|
||||
```
|
||||
|
||||
- Docker: `www/` copy lúc build → `docker compose up --build -d` sau sửa UI.
|
||||
- Hard refresh (`Ctrl+Shift+R`) nếu cache JS/CSS.
|
||||
|
||||
##### So sánh MiR ↔ Test3
|
||||
|
||||
| MiR §2.1 | Test3 |
|
||||
|----------|-------|
|
||||
| Sign in bắt buộc | Chưa có — mở thẳng UI |
|
||||
| User / User group | Chưa có |
|
||||
| PIN operator | Chưa có |
|
||||
| REST auth | API công khai (phù hợp dev) |
|
||||
| Sign in bắt buộc | Có |
|
||||
| Tab password \| PIN + keypad | Có |
|
||||
| 3 role mặc định | Admin / User / Distributor |
|
||||
| PIN không mặc định | Có — admin gán API |
|
||||
| User menu, đổi password, sign out | Có |
|
||||
| Credentials / permissions tách biệt | Có |
|
||||
| Setup → Users (UI) | Chưa — chỉ API |
|
||||
| Auto sign-out / OAuth Fleet | Chưa |
|
||||
|
||||
### 2.2 Navigating the MiR robot interface
|
||||
|
||||
@@ -341,7 +435,7 @@ Xác thực: HTTP Basic (user/password robot).
|
||||
| Loop / Break / Continue | `www/missions.js` + `mission_queue.cpp` |
|
||||
| Pause / Continue | `/api/mission_queue/pause`, `/continue` |
|
||||
| Cancel (Modbus coil 3) | `/api/mission_queue/cancel` |
|
||||
| Sign in / User groups | **Chưa triển khai** (xem §2.1) |
|
||||
| Sign in / User groups | **Đã triển khai** — §2.1 (`AuthService`, UI MiR, `data/auth.json`) |
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user