Skip to content

权限控制

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
}

认证流程

  1. 登录:用户提交用户名和密码
  2. 验证:系统验证凭据
  3. 生成 Token:验证通过后生成 JWT
  4. 携带 Token:后续请求携带 Token
  5. 验证 Token:中间件验证 Token 有效性
  6. 权限检查:根据角色检查权限

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()
    }
}

默认账户

系统首次启动时自动创建三个默认账户:

角色用户名密码用途
管理员adminadmin123系统管理
操作员operatoroperator123日常操作
只读用户readonlyreadonly123数据查看

安全建议

  1. 首次登录后立即修改密码
  2. 删除或禁用默认账户(生产环境)
  3. 创建新的管理员账户
  4. 定期更换密码

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>

最佳实践

权限设计原则

  1. 最小权限原则:只授予必要的权限
  2. 职责分离:不同角色负责不同功能
  3. 审计日志:记录重要操作
  4. 定期审查:定期检查用户权限

安全建议

  1. 强密码策略

    • 最少8位字符
    • 包含大小写字母、数字、特殊字符
    • 定期更换密码
  2. 会话管理

    • 设置合理的 Token 过期时间
    • 支持手动登出
    • 单点登录限制
  3. 访问控制

    • 限制登录失败次数
    • 记录登录日志
    • 异常登录告警
  4. 数据保护

    • 敏感数据加密存储
    • 传输使用 HTTPS
    • 定期备份数据

权限扩展

如需添加新的角色或权限:

  1. 修改角色枚举
  2. 更新权限矩阵
  3. 修改中间件逻辑
  4. 更新前端权限配置
  5. 更新文档说明

基于 MIT 许可发布