Skip to content

用户与权限设计

目前我们已经有一些服务,主要基于ECS,结合现有的服务和现状,做出以下设计和考量。

权限方案比较

AWS IAM

特点

  • 与现有的AWS服务深度集成
  • 基于策略(Policy)的细粒度权限控制
  • 支持用户、组、角色和资源级别的权限
  • 支持条件化权限(如IP限制、时间限制)

优势

  • 细粒度的资源访问控制
  • 适合云原生架构
  • 支持临时凭证和联合身份

劣势

  • 主要针对AWS服务,严格遵守AWS的范式,深度绑定
  • 配置复杂度高
  • 学习曲线陡峭

RuoYi-Admin + OPA

用户管理在Foxx_Web_Service 使用的开源的ruoyi框架提供

特点

  • 基于角色(RBAC)的权限模型
  • 内置用户管理、菜单管理功能
  • OPA提供灵活的策略评估

优势

  • ruoyi框架本身开箱即用的管理界面
  • 在中小规模系统中已于实现
  • 权限管理界面友好

劣势

  • 扩展性受限
  • 多租户支持不够强大
  • 与云原生架构集成需要额外工作,可能需要深度定制源码

Keycloak + OPA

特点

  • 完整的身份认证与授权解决方案
  • 支持多种认证协议(OIDC, OAuth2, SAML)
  • 细粒度的权限控制
  • 多租户支持(Realm)

优势

  • 强大的身份管理能力
  • 与云原生架构兼容性好
  • 可扩展的权限模型

劣势

  • 部署和维护相对复杂
  • 资源消耗较高
  • 配置学习曲线陡峭

方案选择与设计

基于系统现状(包括门户网站、数字孪生系统和其它服务),推荐采用 Keycloak + OPA 方案:

架构图

身份验证流程详解

实现方案

  1. 身份管理

    • 部署Keycloak作为主要身份提供者
    • 定义用户角色层次:系统管理员 >项目租户>楼栋管理员>访客。
  2. 认证流程

    • 基于OAuth2/OIDC实现SSO
    • 支持多种认证方式(密码、证书、MFA)
    • JWT token包含必要权限信息
  3. 授权模型

    • 使用OPA实现RBAC+ABAC混合模型
    • 权限粒度:系统级、租户级、资源级
    • 动态权限评估,支持条件表达式
  4. 租户隔离

    • 基于Keycloak Realm实现租户隔离
    • 数据隔离通过租户ID实现
    • 跨租户操作需特殊授权

权限模型示例

根据业务初步粗略的分为以下角色:
系统管理员 > 项目租户 > 楼栋管理员 > 访客。

角色定义

json
{
  "roles": {
    "system_admin": {
      "description": "系统管理员,拥有全部权限",
      "permissions": [
        "*:*"
      ]
    },
    "project_admin": {
      "description": "项目租户,管理整个项目的所有资源",
      "permissions": [
        "project:*",
        "building:*",
        "robot:*",
        "cicd:*",
        "dt:*",
        "logs:*"
      ]
    },
    "building_admin": {
      "description": "楼栋管理员,管理指定楼栋内的资源",
      "permissions": [
        "building:read",
        "building:manage",
        "robot:read",
        "robot:execute",
        "dt:read",
        "logs:read"
      ]
    },
    "viewer": {
      "description": "访客,基础查看权限",
      "permissions": [
        "building:read",
        "robot:read",
        "dt:read",
        "logs:read"
      ]
    }
  }
}

OPA策略示例

rego
package authz

import input

default allow = false

# 系统管理员有所有权限
allow {
  input.user.role == "system_admin"
}

# 项目租户可以管理其项目内的所有资源
allow {
  input.user.role == "project_admin"
  input.user.project_id == input.resource.project_id
}

# 楼栋管理员可以管理其负责的楼栋资源
allow {
  input.user.role == "building_admin"
  input.resource.building_id == input.user.building_id
  input.user.project_id == input.resource.project_id
}

# 多楼栋管理权限
allow {
  input.user.role == "building_admin"
  building_ids := input.user.building_ids
  building_id := input.resource.building_id
  building_ids[_] == building_id
  input.user.project_id == input.resource.project_id
}

# 访客只能查看被授权的项目资源
allow {
  input.user.role == "viewer"
  input.user.project_id == input.resource.project_id
  input.action == "read"
}

实施步骤

  1. 第一阶段:基础认证

    • 部署Keycloak(已在本地服务器中验证完成)
    • 集成现有用户系统
    • 实现基本登录功能
  2. 第二阶段:授权基础

    • 部署OPA
    • 实现基本RBAC模型
    • API网关集成
  3. 第三阶段:高级功能

    • 多租户隔离
    • 细粒度权限控制
    • 审计日志
  4. 第四阶段:平台化

    • 权限管理界面
    • 自助服务功能
    • 动态策略更新

与现有系统集成

  1. 门户网站:通过OIDC或OAuth2集成Keycloak,前端使用JWT令牌访问后端API

  2. 数字孪生系统:实现基于资源的访问控制,资源权限通过OPA评估

  3. AWS服务:配置Keycloak与AWS IAM的联合身份,实现无缝衔接

  4. API网关:作为所有服务的统一入口,集成认证和授权功能

  5. 零散服务:通过SDK或中间件方式集成权限验证

此设计方案利用Keycloak强大的认证能力和OPA灵活的授权策略,适应现有的分布式架构,同时满足未来的扩展需求。