权限控制
IPAM 提供精细化的权限控制体系,支持多角色、多层次的访问控制,保障数据安全。
角色体系
系统内置三种角色,满足不同用户的访问需求:
| 角色 | 标识 | 权限级别 | 适用人群 |
|---|---|---|---|
| 管理员 | admin | 最高 | 系统管理员 |
| 操作员 | operator | 中等 | 网络管理员 |
| 只读用户 | readonly | 最低 | 普通用户 |
角色权限详情
管理员 (admin)
拥有系统的完整管理权限:
用户管理
- ✅ 创建、编辑、删除用户
- ✅ 重置用户密码
- ✅ 分配用户角色
- ✅ 查看用户登录日志
数据导入导出
- ✅ 全量数据导出
- ✅ 批量数据导入
- ✅ 下载导入模板
系统配置
- ✅ 修改系统配置
- ✅ 管理备份配置
- ✅ 执行手动备份
- ✅ 下载备份文件
所有资源的 CRUD
- ✅ 网络区域:创建、编辑、删除
- ✅ 网关:创建、编辑、删除
- ✅ 子网:创建、编辑、删除
- ✅ 单位:创建、编辑、删除
- ✅ 部门:创建、编辑、删除
- ✅ 项目:创建、编辑、删除
- ✅ IP地址:分配、释放、编辑、删除
- ✅ 用户联系人:创建、编辑、删除
- ✅ 字段定义:创建、编辑、删除
操作员 (operator)
拥有日常操作权限,但无法管理用户和系统配置:
用户管理
- ❌ 无法管理用户
- ✅ 修改自己的密码
数据导入导出
- ❌ 无法导入导出数据
系统配置
- ❌ 无法修改系统配置
资源管理
- ✅ 网络区域:查看
- ✅ 网关:查看
- ✅ 子网:查看
- ✅ 单位:查看
- ✅ 部门:查看
- ✅ 项目:查看、创建、编辑
- ✅ IP地址:分配、释放、编辑
- ✅ 用户联系人:创建、编辑、删除
- ✅ 字段定义:查看
只读用户 (readonly)
仅拥有查看权限:
用户管理
- ❌ 无法管理用户
- ✅ 修改自己的密码
数据导入导出
- ❌ 无法导入导出数据
系统配置
- ❌ 无法修改系统配置
资源管理
- ✅ 网络区域:仅查看
- ✅ 网关:仅查看
- ✅ 子网:仅查看
- ✅ 单位:仅查看
- ✅ 部门:仅查看
- ✅ 项目:仅查看
- ✅ IP地址:仅查看
- ✅ 用户联系人:仅查看
- ✅ 字段定义:仅查看
权限矩阵
| 功能 | 管理员 | 操作员 | 只读用户 |
|---|---|---|---|
| 用户管理 | |||
| 用户列表 | ✅ | ❌ | ❌ |
| 创建用户 | ✅ | ❌ | ❌ |
| 编辑用户 | ✅ | ❌ | ❌ |
| 删除用户 | ✅ | ❌ | ❌ |
| 重置密码 | ✅ | ❌ | ❌ |
| 网络区域 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ❌ | ❌ |
| 编辑 | ✅ | ❌ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 网关 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ❌ | ❌ |
| 编辑 | ✅ | ❌ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 子网 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ❌ | ❌ |
| 编辑 | ✅ | ❌ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 单位 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ❌ | ❌ |
| 编辑 | ✅ | ❌ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 部门 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ❌ | ❌ |
| 编辑 | ✅ | ❌ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 项目 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 创建 | ✅ | ✅ | ❌ |
| 编辑 | ✅ | ✅ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| IP地址 | |||
| 查看列表 | ✅ | ✅ | ✅ |
| 分配 | ✅ | ✅ | ❌ |
| 释放 | ✅ | ✅ | ❌ |
| 编辑 | ✅ | ✅ | ❌ |
| 删除 | ✅ | ❌ | ❌ |
| 导入导出 | |||
| 数据导出 | ✅ | ❌ | ❌ |
| 数据导入 | ✅ | ❌ | ❌ |
| 系统配置 | |||
| 查看配置 | ✅ | ❌ | ❌ |
| 修改配置 | ✅ | ❌ | ❌ |
| 备份管理 | ✅ | ❌ | ❌ |
认证机制
JWT 认证
系统使用 JWT (JSON Web Token) 进行身份认证:
go
// JWT Claims
type Claims struct {
UserID int `json:"user_id"`
Username string `json:"username"`
Role string `json:"role"`
jwt.StandardClaims
}认证流程
- 登录:用户提交用户名和密码
- 验证:系统验证凭据
- 生成 Token:验证通过后生成 JWT
- 携带 Token:后续请求携带 Token
- 验证 Token:中间件验证 Token 有效性
- 权限检查:根据角色检查权限
Token 配置
toml
[jwt]
secret = "your-secret-key"
expire_hours = 24中间件实现
认证中间件
go
func AuthMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
// 验证 Token
// 解析用户信息
// 设置用户上下文
c.Next()
}
}角色中间件
go
func RoleMiddleware(roles ...string) gin.HandlerFunc {
return func(c *gin.Context) {
userRole := c.GetString("role")
// 检查用户角色是否在允许列表中
if !contains(roles, userRole) {
c.JSON(403, gin.H{"error": "权限不足"})
c.Abort()
return
}
c.Next()
}
}默认账户
系统首次启动时自动创建三个默认账户:
| 角色 | 用户名 | 密码 | 用途 |
|---|---|---|---|
| 管理员 | admin | admin123 | 系统管理 |
| 操作员 | operator | operator123 | 日常操作 |
| 只读用户 | readonly | readonly123 | 数据查看 |
安全建议
- 首次登录后立即修改密码
- 删除或禁用默认账户(生产环境)
- 创建新的管理员账户
- 定期更换密码
API 权限控制
接口权限注解
go
// @Security ApiKeyAuth
// @Router /api/users [get]
func (h *UserHandler) GetUsers(c *gin.Context) {
// 需要认证
}
// @Security ApiKeyAuth
// @Role admin
// @Router /api/users [post]
func (h *UserHandler) CreateUser(c *gin.Context) {
// 需要管理员权限
}权限检查示例
go
func (h *Handler) SomeHandler(c *gin.Context) {
userRole := c.GetString("role")
// 检查是否为管理员
if userRole != "admin" {
response.Forbidden(c, "需要管理员权限")
return
}
// 执行业务逻辑
}前端权限控制
路由权限
前端根据用户角色控制路由访问:
typescript
const routes = [
{
path: '/users',
component: Users,
meta: {
roles: ['admin'] // 仅管理员可访问
}
},
{
path: '/ip-addresses',
component: IPAddresses,
meta: {
roles: ['admin', 'operator'] // 管理员和操作员可访问
}
}
]按钮权限
根据角色控制按钮显示:
vue
<template>
<button v-if="hasRole('admin')">删除</button>
<button v-if="hasRole(['admin', 'operator'])">编辑</button>
</template>最佳实践
权限设计原则
- 最小权限原则:只授予必要的权限
- 职责分离:不同角色负责不同功能
- 审计日志:记录重要操作
- 定期审查:定期检查用户权限
安全建议
强密码策略:
- 最少8位字符
- 包含大小写字母、数字、特殊字符
- 定期更换密码
会话管理:
- 设置合理的 Token 过期时间
- 支持手动登出
- 单点登录限制
访问控制:
- 限制登录失败次数
- 记录登录日志
- 异常登录告警
数据保护:
- 敏感数据加密存储
- 传输使用 HTTPS
- 定期备份数据
权限扩展
如需添加新的角色或权限:
- 修改角色枚举
- 更新权限矩阵
- 修改中间件逻辑
- 更新前端权限配置
- 更新文档说明