用户管理与权限分级
用户体系概述
YunyiRADIUS 的用户分为两大体系:
| 体系 | 说明 | 管理入口 | 认证方式 |
|---|---|---|---|
| RADIUS 用户 | 上网终端用户(租户/访客) | 用户管理 | PAP/CHAP/EAP/短信 |
| 管理操作员 | 后台管理员/运维 | 操作员管理 | JWT + bcrypt |
RADIUS 用户管理
RADIUS 用户是实际使用网络接入服务的人员。
用户列表
在「用户管理」页面查看、搜索所有 RADIUS 用户,支持按用户名、手机号、状态、MAC 地址、IP 地址等条件筛选。
添加用户
| 参数 | 说明 | 必填 | 示例 |
|---|---|---|---|
| 用户名 | 登录名,3-32 位 | ✅ | zhangsan |
| 密码 | 认证密码,至少 8 位含字母+数字 | ✅ | MyPass@2024 |
| 真实姓名 | 用户姓名 | 张三 | |
| 手机号 | 用于短信验证 | 13800138000 | |
| 邮箱 | 通知邮箱 | zhangsan@example.com | |
| 所属节点 | 多租户隔离 | node-hotel-A | |
| 关联模板 | RADIUS 策略模板 | 选择 Profile | |
| 状态 | 启用/禁用 | enabled | |
| 过期时间 | 账号有效期 | 2025-12-31 | |
| 在线数限制 | 并发在线设备数,0=无限制 | 3 | |
| 上行速率 (Kbps) | 上传带宽 | 10240 (10M) | |
| 下行速率 (Kbps) | 下载带宽 | 20480 (20M) | |
| 地址池 | IP 地址分配池 | pool-guest | |
| VLAN 绑定 | VLAN ID | 100 | |
| MAC 绑定 | 绑定 MAC 地址 | 00:11:22:33:44:55 | |
| IP 绑定 | 绑定固定 IP | 10.0.0.100 | |
| 域名 | 域名后缀 | hotel-a.com |
密码加密机制
用户密码使用 AES-256-GCM 加密存储,密钥从 Web.Secret 派生:
创建/修改密码 → EncryptField(password, key) → DB 存储 "$aes$..."
RADIUS 认证时 → DecryptField(stored, key) → 还原明文 → PAP/CHAP 验证整个加密解密过程对 RADIUS 认证透明,不影响任何认证协议。
用户认证方式
| 方式 | 协议 | 说明 | 适用场景 |
|---|---|---|---|
| 用户名+密码 | PAP | 明文密码(设备与 RADIUS 之间加密) | 标准 WiFi |
| 用户名+密码 | CHAP | 质询-响应,不传输明文 | 设备安全要求高 |
| MS-CHAPv2 | EAP | 微软 CHAP 增强版 | Windows 域环境 |
| EAP-PEAP | EAP | 证书+密码双层保护 | 企业 WPA 网络 |
| EAP-TTLS | EAP | 隧道化 TLS | 高校/运营商 |
| MAC 认证 | MAC Auth | MAC 地址白名单,无密码 | IoT/打印机 |
| 短信验证码 | PAP | 手机号+验证码 | 公共 Wi-Fi / 访客 |
| LDAP/AD | CHAP | 企业域账号统一认证 | 办公网络 |
| TOTP | PAP+二次 | 基于时间的二次验证 | 高安全场景 |
批量导入
支持 Excel/CSV 批量导入用户:
- 点击「导入」→ 下载模板
- 按模板格式填写(必填:用户名、密码;可选:手机号、MAC、带宽等)
- 上传文件 → 系统自动加密密码 → 关联默认 Profile
在线会话管理
「会话管理」页面展示当前在线用户:
| 操作 | 说明 |
|---|---|
| 查看详情 | 连接 IP、MAC、NAS 设备、上线时长、流量统计 |
| 强制下线 | 向 NAS 发送 Disconnect/CoA 终止会话 |
| CoA 调速率 | 动态调整用户带宽(向 NAS 发送 CoA-Request) |
| 查看日志 | 认证/计费历史记录 |
用户组与网络节点
RADIUS 用户可归入用户组,用户组在网络节点的「用户组」管理中维护:
- 一个网络节点包含若干用户组;
- 用户未指定用户组时,自动归入该节点的默认用户组(默认组不可删除);
- 套餐与策略可按用户组过滤,实现精细化授权。
用户创建时的「所属节点」用于多租户隔离;更细粒度的分组与权限请使用节点下的用户组。
管理操作员与权限分级
YunyiRADIUS 使用 RBAC (Role-Based Access Control) 权限模型。
系统预置角色
| 角色 | 等级 | 权限范围 | 适用人员 |
|---|---|---|---|
| super (超级管理员) | 最高 | 全部功能,包括系统配置、操作员管理 | 系统所有者 |
| admin (管理员) | 高 | 除操作员管理和系统设置外的所有功能 | 运维主管 |
| 自定义角色 | 灵活 | 按需配置每个 API 的读/写权限 | 值班/客服/财务 |
角色权限矩阵
| 功能模块 | super | admin | 自定义(示例) |
|---|---|---|---|
| 仪表盘 | ✅ 读写 | ✅ 读 | ✅ 读 |
| 用户管理 | ✅ 读写 | ✅ 读写 | ✅ 读写 |
| NAS 设备管理 | ✅ 读写 | ✅ 读写 | ✅ 读 |
| 会话管理 | ✅ 读写 | ✅ 读写 | ✅ 读 |
| 套餐策略 | ✅ 读写 | ✅ 读写 | ✅ 读 |
| 接入策略 | ✅ 读写 | ✅ 读写 | ✅ 读 |
| Portal 模板 | ✅ 读写 | ✅ 读写 | ❌ |
| 财务管理 | ✅ 读写 | ✅ 读写 | ❌ |
| 系统设置 | ✅ 读写 | ❌ | ❌ |
| 操作员管理 | ✅ 读写 | ❌ | ❌ |
| 备份恢复 | ✅ 读写 | ❌ | ❌ |
创建自定义角色
进入「系统管理 → 角色管理」→ 新建角色:
- 设置角色名称(如"客服"、"财务"、"只读")
- 为每个功能模块配置权限:
- 无权限:模块不可见
- 只读 (read):只能查看列表和详情
- 读写 (write):可以创建、编辑、删除
- 将该角色分配给操作员
API 端点权限精细控制
每个 API 端点都可以独立控制读/写权限:
go
// 示例:财务端点需要 finance 模块的写权限
webserver.ApiPOST("/finance/recharge", manualRecharge, requireWrite("finance"))
webserver.ApiGET("/finance/payments", listPayments, requireRead("finance"))操作员账号安全
| 安全措施 | 说明 |
|---|---|
| bcrypt 密码哈希 | 不可逆加密,原始密码不存储 |
| JWT Token | 登录后签发,默认 2 小时有效期 |
| HttpOnly Cookie | yr_token 仅服务端可读,防 XSS |
| SameSite=Lax | 防 CSRF 跨站请求伪造 |
| 登录速率限制 | 同一 IP 5 次/3 分钟,防爆破 |
| 操作日志 | 所有增删改操作记录到审计日志 |
操作员管理操作
进入「系统管理 → 操作员管理」:
| 操作 | 说明 | 权限要求 |
|---|---|---|
| 添加 | 创建新操作员账号 | super |
| 编辑 | 修改角色、手机号、状态 | super |
| 禁用/启用 | 临时停用操作员 | super |
| 重置密码 | 设置新密码(原密码不可见) | super |
| 查看日志 | 查看操作员的操作记录 | super/admin |
用户充值退款管理
预付费模式
用户余额扣减,余额不足自动断网:
- 管理员充值:「财务管理 → 充值」,输入金额和备注
- 用户自助充值:用户门户在线支付(支付宝)
- 余额查询:在用户详情页查看余额和流水
退款流程
- 「财务管理 → 退款」
- 输入退款金额(不能超过余额)
- 填写退款原因
- 确认后余额扣减并记录流水
套餐变更
- 用户详情页 → 「变更套餐」
- 选择新套餐计划
- 系统自动计算差价
- 确认后立即生效
用户状态流转
注册(新建) ──→ 启用(enabled) ──→ 正常使用
│
├──→ 过期(expired) ──→ 无法认证
│
├──→ 禁用(disabled) ──→ 无法认证
│
└──→ 余额不足 ──→ 自动断网