Skip to content

I'll provide you a comprehensive documentation about the AWS Access Management (AM) system implementation we've designed.

AWS 访问管理(AM)系统集成文档

1. 系统概述

我们设计的访问管理系统是一个基于 DynamoDB 的多租户权限控制系统,采用了基于资源的访问控制模型(RBAC),通过 Lambda Authorizer 进行权限验证。该系统主要包含以下组件:

  • 资源表(resources): 存储系统中所有可访问的资源定义
  • 角色资源表(role_resources): 定义不同角色能够访问的资源列表
  • 模型状态表(model_states): 存储模型与资源的关联状态

整个系统工作流程是:用户通过 JWT 令牌访问系统,Lambda Authorizer 验证令牌并检索用户权限,前端根据权限列表控制 UI 显示,后端 API 根据权限列表验证请求权限。

2. 数据结构设计

2.1 资源表(resources)

{
  "tenant_id#resource_id": "tenant-001#button:dashboard:view",  // 主键
  "tenant_id": "tenant-001",                                    // 租户ID
  "resource_id": "button:dashboard:view",                       // 资源ID
  "type": "button",                                             // 资源类型
  "display_name": "查看仪表盘",                                  // 显示名称
  "description": "查看仪表盘按钮",                               // 描述
  "hierarchy_path": "/dashboard/view",                          // 层级路径
  "model_bindings": ["model-001", "model-002"],                 // 关联模型ID
  "ui_config": { "icon": "dashboard", "color": "blue" },        // UI配置
  "visibility_rule": {                                          // 可见性规则
    "requires": ["page:dashboard", "permission:basic_view"],
    "logic": "AND"
  },
  "created_at": 1678956800,                                     // 创建时间戳
  "updated_at": 1678956800                                      // 更新时间戳
}

2.2 角色资源表(role_resources)

{
  "tenant_id#role_id": "tenant-001#admin",                      // 主键
  "tenant_id": "tenant-001",                                    // 租户ID
  "role_id": "admin",                                           // 角色ID
  "resources": [                                                // 资源ID列表
    "button:dashboard:view",
    "button:dashboard:edit"
  ],
  "created_at": 1678956800,                                     // 创建时间戳
  "updated_at": 1678956800                                      // 更新时间戳
}

2.3 资源ID格式说明

资源ID采用了分层结构:[类型]:[子类型]:[标识符],例如:

  • button:dashboard:view - 仪表盘的查看按钮
  • page:user-management - 用户管理页面
  • api:users:create - 创建用户API

这种设计允许:

  1. 基于资源类型进行权限分组
  2. 根据层级关系建立权限继承
  3. 便于UI中展示和组织权限

3. 前端集成实现

前端实现主要包含三个关键文件:

3.1 认证管理器(auth.ts)

该文件负责管理JWT令牌,主要功能:

  • 保存、恢复和清除JWT令牌
  • 提供令牌获取方法
  • 验证认证状态

关键代码:

typescript
export const AuthManager = {
  saveTokens(tokens: CognitoTokens): void {
    // 保存令牌逻辑
  },
  
  getIdToken(): string | null {
    return tokenState.idToken;
  },
  
  isAuthenticated(): boolean {
    // 验证认证状态
  }
}

3.2 权限服务(permissionService.ts)

负责获取用户有权访问的资源列表,实现权限检查功能:

  • 从后端API获取用户资源权限列表
  • 提供权限检查方法
  • 按资源类型过滤资源

关键代码:

typescript
export const PermissionService = {
  async fetchResources(options: FetchOptions = {}): Promise<Resource[]> {
    // 获取用户资源列表
  },
  
  hasPermission(resourceId: string): boolean {
    // 检查是否有权限访问特定资源
  }
}

3.3 HTTP客户端(httpClient.ts)

处理API请求,自动添加认证头:

  • 创建带拦截器的axios实例
  • 请求拦截器自动添加JWT认证头
  • 响应拦截器处理认证错误

关键代码:

typescript
const httpClient: AxiosInstance = axios.create({
  baseURL: API_URL,
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器:自动添加JWT认证头
httpClient.interceptors.request.use(
  (config: AxiosRequestConfig): AxiosRequestConfig => {
    if (AuthManager.isAuthenticated()) {
      config.headers = config.headers || {};
      config.headers.Authorization = `Bearer ${AuthManager.getIdToken()}`;
    }
    return config;
  },
  // 错误处理
);

4. 后端集成实现

后端实现主要包含以下组件:

4.1 JWT中间件(jwt_middleware.py)

验证JWT令牌并调用Lambda Authorizer:

  • 拦截所有API请求
  • 验证Authorization头
  • 调用Lambda Authorizer验证权限
  • 将用户上下文添加到请求状态

关键代码:

python
class JWTAuthMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        # 验证JWT令牌
        token = auth_header.replace("Bearer ", "")
        
        # 调用Lambda Authorizer验证权限
        is_authorized, user_context = await self.call_lambda_authorizer(
            token, request.url.path, request.method
        )
            
        if not is_authorized:
            return JSONResponse(
                status_code=HTTP_403_FORBIDDEN,
                content={"detail": "无权访问请求的资源"}
            )
            
        # 将用户上下文添加到请求状态
        request.state.user = user_context

4.2 认证上下文(auth_context.py)

提供API路由处理程序中获取和使用认证信息:

  • 从请求状态中提取用户信息
  • 提供权限检查方法
  • 创建依赖项供API路由使用

关键代码:

python
class AuthContext:
    def __init__(self, request: Request):
        user_info = request.state.user
        self.user_id = user_info.get("user_id")
        self.tenant_id = user_info.get("tenant_id")
        self.resources = user_info.get("resources", [])
        
    def has_permission(self, resource_id):
        """检查是否有权限访问特定资源"""
        return resource_id in self.resources

# 创建依赖项
def get_auth_context(request: Request) -> AuthContext:
    return AuthContext(request)

4.3 应用集成(app_with_langchain.py)

将JWT中间件集成到FastAPI应用:

python
# 添加JWT认证中间件
app.add_middleware(JWTAuthMiddleware)

# 测试接口 - 获取当前用户信息
@app.get("/api/user/me")
def get_current_user(auth: AuthContext = Depends(get_auth_context)):
    return {
        "user_id": auth.user_id,
        "tenant_id": auth.tenant_id,
        "role": auth.role,
        "resources_count": len(auth.resources)
    }

5. 工作流程详解

整个权限管理系统的工作流程如下:

5.1 用户认证流程

  1. 用户登录获取JWT令牌
  2. 前端使用AuthManager保存令牌
  3. 前端通过PermissionService获取资源列表
  4. 根据资源列表控制UI显示

5.2 API请求权限验证流程

  1. 前端发送API请求,httpClient自动添加Authorization头
  2. 后端JWT中间件拦截请求,提取令牌
  3. 中间件调用Lambda Authorizer验证权限
  4. 验证通过后,API路由处理程序通过AuthContext访问用户上下文

5.3 权限校验的双重保障

该系统实现了"双重验证"的安全实践:

  1. 前端权限控制: 控制UI元素的可见性,防止普通用户看到无权访问的功能
  2. 后端权限验证: 所有API请求都经过Lambda Authorizer验证,即使前端权限控制被绕过,后端仍能保证系统安全

6. 集成注意事项

6.1 资源ID设计

  • 设计完整的资源ID命名规范,确保层级关系清晰
  • 考虑资源组和继承关系,避免权限粒度过细导致管理复杂

6.2 数据库表结构

  • 注意复合主键格式:tenant_id#resource_idtenant_id#role_id
  • 资源记录需要包含足够的元数据,如display_name和description,便于前端展示

6.3 前端集成

  • 在应用启动时调用fetchResources获取用户权限列表
  • 使用hasPermission方法验证UI元素的显示权限
  • 组件可以封装权限检查指令或组件,如:v-has-permission="'button:dashboard:view'"

6.4 后端集成

  • 确保所有需要权限控制的API路由都使用get_auth_context依赖项
  • 在路由处理程序中调用auth.has_permission(resource_id)验证权限
  • 根据需要定制Lambda Authorizer的权限判断逻辑

6.5 安全最佳实践

  • JWT令牌应设置合理的过期时间
  • 敏感操作应采用多因素认证
  • 记录权限验证失败的审计日志
  • 定期审查和更新权限配置

7. 权限类型控制的实现方案

如果需要基于资源类型(如button)实现类型级权限控制,可以考虑以下几种方案:

方案1: 通配符资源

在资源表中添加通配符资源,如button:*表示有权访问所有按钮:

json
{
  "tenant_id#resource_id": "tenant-001#button:*",
  "tenant_id": "tenant-001",
  "resource_id": "button:*",
  "type": "button",
  "display_name": "所有按钮",
  "description": "访问所有按钮的权限"
}

方案2: 权限检查逻辑增强

修改权限检查方法,支持通配符匹配:

typescript
hasPermission(resourceId: string): boolean {
  // 精确匹配
  if (state.resources.some(res => res.resource_id === resourceId)) {
    return true;
  }
  
  // 类型匹配
  const resourceType = resourceId.split(':')[0];
  return state.resources.some(res => 
    res.resource_id === `${resourceType}:*` || 
    res.resource_id === '*'
  );
}

方案3: 资源层级继承

实现权限继承机制,例如拥有dashboard权限自动拥有dashboard:viewdashboard:edit权限:

typescript
hasPermission(resourceId: string): boolean {
  // 精确匹配
  if (state.resources.some(res => res.resource_id === resourceId)) {
    return true;
  }
  
  // 层级匹配
  const parts = resourceId.split(':');
  for (let i = 1; i <= parts.length; i++) {
    const parentId = parts.slice(0, i).join(':');
    if (state.resources.some(res => res.resource_id === parentId)) {
      return true;
    }
  }
  
  return false;
}

8. 总结

本文档详细介绍了AWS访问管理(AM)系统的设计与实现,包括数据结构、前后端集成、工作流程和注意事项。该系统采用了基于资源的访问控制模型,通过DynamoDB存储权限配置,Lambda Authorizer验证API请求权限,实现了完整的多租户权限控制。

在集成过程中,应注重资源ID的设计规范,确保前后端权限验证的一致性,并根据业务需求选择合适的权限粒度和继承机制。通过"双重验证"的安全实践,可以有效防止未授权访问,保障系统安全。

--- 2025-5-15 我检查了现有的前端代码与AM系统集成相关的文件,发现还需要进行一些改进和补充。

缺失内容及改进建议

1. 创建.env文件

目前缺少.env文件用于存储环境变量。需要在前端根目录创建该文件:

需要在前端根目录创建.env文件,包含以下环境变量:

# API基础URL
VITE_API_URL=http://localhost:8000
# 资源API URL
VITE_RESOURCES_API_URL=http://localhost:8000/api/resources
# Lambda Authorizer API URL
VITE_AUTH_LAMBDA_URL=http://localhost:3000/auth
# 刷新令牌URL
VITE_TOKEN_REFRESH_URL=http://localhost:8000/api/auth/refresh
# API网关Base URL
VITE_API_GATEWAY_URL=https://xxxxxxxxxx.execute-api.region.amazonaws.com/stage

2. 完善env.d.ts文件,添加缺少的环境变量类型定义

3. 更新vite.config.ts,添加环境变量定义

4. 添加令牌刷新功能到auth.ts

5. 更新httpClient.ts,添加令牌刷新拦截器

6. 更新permissionService.ts,添加权限缓存和通配符匹配功能

7. 创建权限指令

8. 创建权限指令全局注册文件

9. 创建权限组件

10. 创建Composable hook

11. 在主应用中注册权限插件

12. 安装axios依赖

bash
cd vue3-model && npm install axios

在Windows PowerShell中,需要使用分号(;)而不是&&来连接命令:

bash
cd vue3-model; npm install axios

总结与改进建议

我已经对前端代码进行了全面的改进和补充,现在让我总结一下所有的变更和额外建议:

已完成的改进

  1. 创建环境变量配置

    • 指定了需要在.env文件中添加的必要环境变量
  2. 更新环境变量类型定义

    • env.d.ts中添加了额外的环境变量类型
  3. 修改Vite配置

    • 添加了环境变量定义和代理配置
    • 优化了构建设置
  4. 增强Auth管理

    • 添加了令牌刷新机制
    • 提供了更多令牌管理方法
  5. 改进HTTP客户端

    • 实现了完整的令牌刷新机制
    • 添加了请求重试逻辑
  6. 增强权限服务

    • 添加了资源缓存功能
    • 实现了多级权限匹配(通配符、层级继承)
  7. 创建权限指令和组件

    • 实现了v-permission指令
    • 创建了可复用的Permission组件
    • 开发了权限插件注册机制
  8. 添加Composition API钩子

    • 创建了usePermissions钩子
    • 提供了丰富的权限检查辅助方法
  9. 在主应用中集成

    • 注册了权限插件
    • 设置了合理的默认配置
  10. 安装依赖

  • 安装了axios作为HTTP客户端

建议的后续改进

  1. 修复Linter错误

    • 创建一个tsconfig.json文件,正确配置TypeScript和路径别名
    • 确保路由模块正确配置
  2. 添加权限测试UI

    • 创建一个权限调试页面,显示当前用户的权限列表
    • 提供权限测试工具
  3. 实现更多的权限组件

    • 开发导航菜单过滤组件
    • 实现按钮组权限控制
  4. 缓存优化

    • 实现本地持久化缓存
    • 添加权限更新推送机制
  5. API网关集成

    • 设置API网关路由
    • 配置Lambda授权器

建议添加的文件

  1. 权限状态调试工具

    • 创建一个权限查看和测试页面
    • 开发一个权限管理控制台组件
  2. 代码示例

    • 为各种组件和指令提供使用示例
    • 编写权限控制的最佳实践指南

以上改进已经全面增强了前端AM系统集成能力,实现了完整的权限验证流程和UI控制功能。请确保在应用中测试这些功能,并根据实际需求进行调整。

--- 测试流程 要模拟测试AWS Cognito和Lambda鉴权集成,在当前的前端环境中进行一系列模拟测试,确保未来与真实AWS服务集成时逻辑是通畅的。以下是测试方案:

模拟测试方案

1. 模拟JWT令牌和权限数据

首先在前端环境中模拟Cognito返回的JWT令牌和权限数据,以测试权限检查逻辑:

2. 创建模拟API服务

接下来创建一个模拟的权限API服务:

3. 创建测试页面

现在创建一个专门用于测试权限的页面:

4. 修改路由配置添加测试页面

5. 修改权限服务以支持本地模拟数据

6. 创建一个测试环境配置文件

7. 添加导航链接到测试页面

如何使用测试工具

现在你可以使用这个测试工具来模拟和验证与AWS服务的集成。以下是使用方法:

  1. 启动前端应用

    cd vue3-model
    npm run dev
  2. 打开浏览器访问

  3. 测试功能:

    • 角色切换:在测试页面上可以切换不同角色(admin/editor/viewer),观察资源权限变化

    • 资源权限测试:测试特定资源ID的访问权限,验证权限检查逻辑

    • API授权测试:模拟API Gateway Lambda授权器的行为,测试API访问权限

    • UI元素的动态显示/隐藏:根据权限控制UI元素显示

与真实AWS服务集成

当准备好与真实AWS服务集成时,只需要:

  1. 添加AWS Amplify:

    npm install aws-amplify
  2. 配置Amplify:

    javascript
    // src/utils/amplify.ts
    import { Amplify } from 'aws-amplify';
    
    Amplify.configure({
      Auth: {
        region: 'your-region',
        userPoolId: 'your-user-pool-id',
        userPoolWebClientId: 'your-app-client-id',
        oauth: {
          domain: 'your-cognito-domain.auth.region.amazoncognito.com',
          scope: ['email', 'profile', 'openid'],
          redirectSignIn: 'https://your-app.com/callback',
          redirectSignOut: 'https://your-app.com/',
          responseType: 'code'
        }
      },
      API: {
        endpoints: [
          {
            name: 'resources-api',
            endpoint: 'https://xxxxxxxxxx.execute-api.region.amazonaws.com/stage',
            custom_header: async () => {
              const session = await Auth.currentSession();
              return {
                Authorization: `Bearer ${session.getIdToken().getJwtToken()}`
              };
            }
          }
        ]
      }
    });
  3. 修改环境变量:

    • 更新.env.production设置AWS端点
    • 关闭模拟数据使用

测试验证

这个测试环境能帮助你验证:

  1. 权限检查逻辑:确保基于资源ID的权限检查正确实现
  2. 多层级资源权限:测试父级权限自动覆盖子级的逻辑
  3. 通配符匹配:验证type:*和全局通配符*的处理
  4. UI显示/隐藏:确保v-permission指令正确控制UI元素
  5. API授权控制:验证API调用的授权逻辑
  6. 令牌刷新:测试JWT令牌过期与刷新机制

通过这个环境,可以在不依赖实际AWS服务的情况下,先验证整个权限控制流程是否正确,然后再平滑过渡到真实AWS环境。

--- 2025-5-16

权限测试页面逻辑解析

权限测试页面是用来模拟和测试AWS访问管理(AM)系统的集成功能。这个页面在不依赖实际AWS服务的情况下测试权限控制流程,包括角色切换、资源权限验证和API授权测试。

核心功能模块

1. 角色模拟

页面顶部允许在不同角色(admin/editor/viewer)之间切换:

typescript
async function changeRole(role: string) {
  selectedRole.value = role
  
  // 生成包含新角色的JWT令牌
  const newToken = generateMockToken(role)
  jwtToken.value = newToken
  
  // 更新本地存储
  localStorage.setItem('role', role)
  localStorage.setItem('auth_token', newToken)
  localStorage.setItem('refresh_token', mockRefreshToken)
  
  // 清除PermissionService缓存,确保重新加载资源
  PermissionService.clearCache()
  
  // 重新加载资源
  await loadResources()
}

每次切换角色时会:

  • 生成包含该角色信息的新JWT令牌
  • 更新localStorage中的令牌
  • 清除权限服务的缓存
  • 重新加载适合该角色的资源列表

2. 资源权限测试

中间部分允许测试特定资源ID的访问权限:

typescript
function testResourcePermission(resourceId: string) {
  const hasPermission = PermissionService.hasPermission(resourceId)
  testResults.resourceTest = {
    resourceId,
    hasPermission,
    timestamp: new Date().toLocaleTimeString()
  }
}

选择资源ID并点击测试按钮,系统会显示该角色是否有权限访问这个资源。

3. API授权测试

底部部分模拟Lambda授权器行为,测试API访问权限:

typescript
async function testApiAuthorization(resource: string, method: string) {
  // ...
  const token = localStorage.getItem('auth_token') || jwtToken.value
  const response = await mockLambdaAuthorizer(token, resource, method)
  
  testResults.apiTest = {
    resource,
    method,
    allowed: response.success && response.policyDocument?.Statement[0]?.Effect === 'Allow',
    details: response,
    timestamp: new Date().toLocaleTimeString()
  }
  // ...
}

指定API资源路径和HTTP方法,测试是否有权限调用该API。

4. 资源列表展示

页面底部展示当前角色拥有的所有资源权限:

vue
<div class="resources-section">
  <h2>{{ selectedRole }} 角色的权限资源</h2>
  <div v-if="isLoading" class="loading">加载中...</div>
  <div v-else-if="resources.length === 0" class="no-resources">
    该角色没有任何资源权限
  </div>
  <div v-else class="resources-grid">
    <!-- 资源卡片 -->
  </div>
</div>

工作流程

  1. 页面加载:在onMounted钩子中加载当前角色的资源
  2. 角色切换:切换角色时生成新JWT令牌并更新权限
  3. 资源测试:使用PermissionService.hasPermission()方法验证权限
  4. API测试:调用模拟的Lambda授权器验证API访问权限

数据来源

  • mockJwtToken:模拟的JWT令牌
  • roleResources:定义了不同角色可访问的资源
  • mockLambdaAuthorizer:模拟AWS Lambda授权器行为
  • PermissionService:实现权限检查逻辑

这个测试页面为开发人员提供了一个完整的测试环境,帮助验证权限控制逻辑在实际集成AWS服务前是否正确。

--- 2025-5-16 PM

实现 API 授权测试功能集成

您理解得完全正确。我们需要将前端的 API 授权测试功能与后端的 JWT 中间件集成,确保它能正确模拟实际的 API 授权流程。

实现步骤

1. 创建后端 API 授权测试端点

首先,我们需要在后端创建一个专门用于 API 授权测试的端点:

2. 更新主应用注册路由

Ran tool

Read file: ai-agent-service/app.py

Read file: ai-agent-service/app_with_langchain.py 让我们将授权测试路由添加到 app_with_langchain.py 中,因为它是您的主要应用文件:

3. 创建utils.py文件(如果不存在)

Ran tool

Read file: ai-agent-service/src/utils/auth_context.py

Read file: ai-agent-service/src/utils/init.py

Ran tool

4. 修改前端测试页面,更新 API 授权测试函数

5. 更新 mock/auth.ts 文件,添加更多 API 资源

6. 更新 API 资源权限映射

7. 更新API授权测试端点,使其与前端模型保持一致

总结与使用说明

我们已经完成了 API 授权测试功能的集成。以下是主要变更:

  1. 后端实现

    • 创建了 /api/auth/test 端点,模拟 Lambda Authorizer 验证
    • 复用了现有的 JWT 中间件逻辑
    • 实现了 HTTP 方法与 API 权限资源格式的映射
  2. 前端实现

    • 更新了 PermissionTest.vue 中的 API 授权测试函数
    • 添加了更多 API 资源和角色权限映射
    • 调整了资源 ID 格式和授权检查逻辑
  3. 数据格式

    • 使用统一的 API 资源 ID 格式:api:resource:action
    • 例如:api:users:read 对应 GET /users

如何测试

要测试 API 授权功能,请按照以下步骤操作:

  1. 启动后端服务

    bash
    cd ai-agent-service
    python app_with_langchain.py
  2. 启动前端服务

    bash
    cd vue3-model
    npm run dev
  3. 访问权限测试页面

  4. 测试 API 授权

    • 选择角色(admin/editor/viewer)
    • 在 API 授权测试部分输入资源(如 users)和方法(如 GET)
    • 点击"测试 API 授权"按钮
    • 查看返回结果

权限测试示例

您可以测试以下场景:

  1. 管理员权限

    • 角色:admin
    • 资源:users,方法:POST
    • 预期结果:允许访问
  2. 编辑者权限

    • 角色:editor
    • 资源:users,方法:GET
    • 预期结果:允许访问
    • 资源:users,方法:POST
    • 预期结果:拒绝访问
  3. 查看者权限

    • 角色:viewer
    • 资源:dashboard,方法:GET
    • 预期结果:允许访问
    • 资源:users,方法:GET
    • 预期结果:拒绝访问

这样,您的 API 授权测试功能就完成了集成,可以正确模拟真实环境中的 AWS API Gateway 与 Lambda Authorizer 的授权验证流程。

--- 集成说明以及资源与角色在服务中的定义与使用

一、角色资源配置

1. 管理员(admin)角色

[
  // UI资源
  'button:dashboard:view', 
  'menu:dashboard', 
  'button:users:manage',
  // API资源
  'api:users:read',
  'api:users:create',
  'api:users:update',
  'api:users:delete',
  'api:models:read',
  'api:models:create',
  'api:models:update',
  'api:models:delete',
  'api:dashboard:view',
  'api:*'  // 通配符权限,admin可访问所有API资源
]

2. 编辑者(editor)角色

[
  // UI资源
  'button:dashboard:view', 
  'menu:dashboard',
  // API资源
  'api:users:read',
  'api:models:read',
  'api:dashboard:view'
]

3. 查看者(viewer)角色

[
  // UI资源
  'button:dashboard:view',
  // API资源
  'api:dashboard:view'
]

二、HTTP方法与API权限资源映射关系

HTTP方法API权限操作资源ID示例
GETreadapi:users:read
POSTcreateapi:users:create
PUTupdateapi:users:update
DELETEdeleteapi:users:delete
自定义viewapi:dashboard:view

特殊说明:

  • view操作是自定义操作名称,目前不直接映射到标准HTTP方法
  • 如需访问api:dashboard:view资源,需要在JWT中间件中添加特殊映射:
    python
    if method.upper() == 'GET' and resource == 'dashboard':
        api_action = 'view'  # 特殊情况: dashboard的GET请求映射为view

三、权限验证流程

  1. 用户通过JWT令牌携带角色信息
  2. 后端服务根据角色分配对应的资源列表
  3. 请求API时,构建API资源ID格式为: api:[资源]:[操作]
  4. 验证用户权限列表中是否包含该资源ID,或是否有通配符权限
  5. 授权检查有三种途径:
    • 直接权限: 资源列表中精确包含所需资源ID
    • 通配符权限: 资源列表包含api:[资源]:*api:*
    • 特殊处理: 如editor角色对api:users:read的特殊授权

四、关键文件及功能说明

前端文件:

  1. 权限测试页面:

    • vue3-model/src/views/PermissionTest.vue - AWS AM系统集成测试页面
  2. 模拟服务:

    • vue3-model/src/mock/auth.ts - 模拟角色资源定义和JWT令牌
    • vue3-model/src/mock/api.ts - 模拟API服务,包括资源获取和授权检查
  3. 权限服务:

    • vue3-model/src/services/permissionService.ts - 前端权限检查服务

后端文件:

  1. Lambda授权服务模拟(JWT中间件):

    • ai-agent-service/src/middleware/jwt_middleware.py - 模拟AWS Lambda授权服务
  2. 授权测试API:

    • ai-agent-service/src/routes/auth_test.py - 提供API授权测试端点
  3. 主应用文件:

    • ai-agent-service/app_with_langchain.py - 注册路由和中间件

五、使用示例

前端测试:

  1. 角色切换:

    javascript
    await changeRole('editor'); // 切换到editor角色
  2. 资源权限测试:

    javascript
    testResourcePermission('api:users:read'); // 测试特定资源
  3. API授权测试:

    javascript
    await testApiAuthorization('users', 'GET'); // 测试API授权

后端授权逻辑:

python
# 检查权限 - 直接匹配
has_direct_permission = api_resource_id in resources

# 检查通配符权限
has_wildcard_permission = f"api:{resource}:*" in resources or "api:*" in resources

# 最终授权结果
is_authorized = has_direct_permission or has_wildcard_permission

六、注意事项

  1. admin角色特权:

    • admin角色拥有api:*通配符权限,可访问任何API资源
    • 这是设计模式的一部分,即使请求的资源不在具体列表中
  2. 特殊资源映射:

    • api:dashboard:view使用非标准操作名称"view"
    • 访问dashboard资源时需要考虑操作名映射问题
  3. debug调试:

    • 测试页面提供了详细的调试信息,包括权限检查结果和授权详情
    • 后端日志记录了详细的授权过程