Appearance
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
这种设计允许:
- 基于资源类型进行权限分组
- 根据层级关系建立权限继承
- 便于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_context4.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 用户认证流程
- 用户登录获取JWT令牌
- 前端使用AuthManager保存令牌
- 前端通过PermissionService获取资源列表
- 根据资源列表控制UI显示
5.2 API请求权限验证流程
- 前端发送API请求,httpClient自动添加Authorization头
- 后端JWT中间件拦截请求,提取令牌
- 中间件调用Lambda Authorizer验证权限
- 验证通过后,API路由处理程序通过AuthContext访问用户上下文
5.3 权限校验的双重保障
该系统实现了"双重验证"的安全实践:
- 前端权限控制: 控制UI元素的可见性,防止普通用户看到无权访问的功能
- 后端权限验证: 所有API请求都经过Lambda Authorizer验证,即使前端权限控制被绕过,后端仍能保证系统安全
6. 集成注意事项
6.1 资源ID设计
- 设计完整的资源ID命名规范,确保层级关系清晰
- 考虑资源组和继承关系,避免权限粒度过细导致管理复杂
6.2 数据库表结构
- 注意复合主键格式:
tenant_id#resource_id或tenant_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:view和dashboard: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/stage2. 完善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总结与改进建议
我已经对前端代码进行了全面的改进和补充,现在让我总结一下所有的变更和额外建议:
已完成的改进
创建环境变量配置
- 指定了需要在
.env文件中添加的必要环境变量
- 指定了需要在
更新环境变量类型定义
- 在
env.d.ts中添加了额外的环境变量类型
- 在
修改Vite配置
- 添加了环境变量定义和代理配置
- 优化了构建设置
增强Auth管理
- 添加了令牌刷新机制
- 提供了更多令牌管理方法
改进HTTP客户端
- 实现了完整的令牌刷新机制
- 添加了请求重试逻辑
增强权限服务
- 添加了资源缓存功能
- 实现了多级权限匹配(通配符、层级继承)
创建权限指令和组件
- 实现了
v-permission指令 - 创建了可复用的
Permission组件 - 开发了权限插件注册机制
- 实现了
添加Composition API钩子
- 创建了
usePermissions钩子 - 提供了丰富的权限检查辅助方法
- 创建了
在主应用中集成
- 注册了权限插件
- 设置了合理的默认配置
安装依赖
- 安装了axios作为HTTP客户端
建议的后续改进
修复Linter错误
- 创建一个
tsconfig.json文件,正确配置TypeScript和路径别名 - 确保路由模块正确配置
- 创建一个
添加权限测试UI
- 创建一个权限调试页面,显示当前用户的权限列表
- 提供权限测试工具
实现更多的权限组件
- 开发导航菜单过滤组件
- 实现按钮组权限控制
缓存优化
- 实现本地持久化缓存
- 添加权限更新推送机制
API网关集成
- 设置API网关路由
- 配置Lambda授权器
建议添加的文件
权限状态调试工具
- 创建一个权限查看和测试页面
- 开发一个权限管理控制台组件
代码示例
- 为各种组件和指令提供使用示例
- 编写权限控制的最佳实践指南
以上改进已经全面增强了前端AM系统集成能力,实现了完整的权限验证流程和UI控制功能。请确保在应用中测试这些功能,并根据实际需求进行调整。
--- 测试流程 要模拟测试AWS Cognito和Lambda鉴权集成,在当前的前端环境中进行一系列模拟测试,确保未来与真实AWS服务集成时逻辑是通畅的。以下是测试方案:
模拟测试方案
1. 模拟JWT令牌和权限数据
首先在前端环境中模拟Cognito返回的JWT令牌和权限数据,以测试权限检查逻辑:
2. 创建模拟API服务
接下来创建一个模拟的权限API服务:
3. 创建测试页面
现在创建一个专门用于测试权限的页面:
4. 修改路由配置添加测试页面
5. 修改权限服务以支持本地模拟数据
6. 创建一个测试环境配置文件
7. 添加导航链接到测试页面
如何使用测试工具
现在你可以使用这个测试工具来模拟和验证与AWS服务的集成。以下是使用方法:
启动前端应用
cd vue3-model npm run dev打开浏览器访问:
测试功能:
角色切换:在测试页面上可以切换不同角色(admin/editor/viewer),观察资源权限变化
资源权限测试:测试特定资源ID的访问权限,验证权限检查逻辑
API授权测试:模拟API Gateway Lambda授权器的行为,测试API访问权限
UI元素的动态显示/隐藏:根据权限控制UI元素显示
与真实AWS服务集成
当准备好与真实AWS服务集成时,只需要:
添加AWS Amplify:
npm install aws-amplify配置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()}` }; } } ] } });修改环境变量:
- 更新
.env.production设置AWS端点 - 关闭模拟数据使用
- 更新
测试验证
这个测试环境能帮助你验证:
- 权限检查逻辑:确保基于资源ID的权限检查正确实现
- 多层级资源权限:测试父级权限自动覆盖子级的逻辑
- 通配符匹配:验证
type:*和全局通配符*的处理 - UI显示/隐藏:确保v-permission指令正确控制UI元素
- API授权控制:验证API调用的授权逻辑
- 令牌刷新:测试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>工作流程
- 页面加载:在
onMounted钩子中加载当前角色的资源 - 角色切换:切换角色时生成新JWT令牌并更新权限
- 资源测试:使用
PermissionService.hasPermission()方法验证权限 - 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 授权测试功能的集成。以下是主要变更:
后端实现:
- 创建了
/api/auth/test端点,模拟 Lambda Authorizer 验证 - 复用了现有的 JWT 中间件逻辑
- 实现了 HTTP 方法与 API 权限资源格式的映射
- 创建了
前端实现:
- 更新了
PermissionTest.vue中的 API 授权测试函数 - 添加了更多 API 资源和角色权限映射
- 调整了资源 ID 格式和授权检查逻辑
- 更新了
数据格式:
- 使用统一的 API 资源 ID 格式:
api:resource:action - 例如:
api:users:read对应 GET /users
- 使用统一的 API 资源 ID 格式:
如何测试
要测试 API 授权功能,请按照以下步骤操作:
启动后端服务:
bashcd ai-agent-service python app_with_langchain.py启动前端服务:
bashcd vue3-model npm run dev访问权限测试页面:
测试 API 授权:
- 选择角色(admin/editor/viewer)
- 在 API 授权测试部分输入资源(如 users)和方法(如 GET)
- 点击"测试 API 授权"按钮
- 查看返回结果
权限测试示例
您可以测试以下场景:
管理员权限:
- 角色:admin
- 资源:users,方法:POST
- 预期结果:允许访问
编辑者权限:
- 角色:editor
- 资源:users,方法:GET
- 预期结果:允许访问
- 资源:users,方法:POST
- 预期结果:拒绝访问
查看者权限:
- 角色: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示例 |
|---|---|---|
| GET | read | api:users:read |
| POST | create | api:users:create |
| PUT | update | api:users:update |
| DELETE | delete | api:users:delete |
| 自定义 | view | api:dashboard:view |
特殊说明:
view操作是自定义操作名称,目前不直接映射到标准HTTP方法- 如需访问
api:dashboard:view资源,需要在JWT中间件中添加特殊映射:pythonif method.upper() == 'GET' and resource == 'dashboard': api_action = 'view' # 特殊情况: dashboard的GET请求映射为view
三、权限验证流程
- 用户通过JWT令牌携带角色信息
- 后端服务根据角色分配对应的资源列表
- 请求API时,构建API资源ID格式为:
api:[资源]:[操作] - 验证用户权限列表中是否包含该资源ID,或是否有通配符权限
- 授权检查有三种途径:
- 直接权限: 资源列表中精确包含所需资源ID
- 通配符权限: 资源列表包含
api:[资源]:*或api:* - 特殊处理: 如editor角色对api:users:read的特殊授权
四、关键文件及功能说明
前端文件:
权限测试页面:
vue3-model/src/views/PermissionTest.vue- AWS AM系统集成测试页面
模拟服务:
vue3-model/src/mock/auth.ts- 模拟角色资源定义和JWT令牌vue3-model/src/mock/api.ts- 模拟API服务,包括资源获取和授权检查
权限服务:
vue3-model/src/services/permissionService.ts- 前端权限检查服务
后端文件:
Lambda授权服务模拟(JWT中间件):
ai-agent-service/src/middleware/jwt_middleware.py- 模拟AWS Lambda授权服务
授权测试API:
ai-agent-service/src/routes/auth_test.py- 提供API授权测试端点
主应用文件:
ai-agent-service/app_with_langchain.py- 注册路由和中间件
五、使用示例
前端测试:
角色切换:
javascriptawait changeRole('editor'); // 切换到editor角色资源权限测试:
javascripttestResourcePermission('api:users:read'); // 测试特定资源API授权测试:
javascriptawait 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六、注意事项
admin角色特权:
- admin角色拥有
api:*通配符权限,可访问任何API资源 - 这是设计模式的一部分,即使请求的资源不在具体列表中
- admin角色拥有
特殊资源映射:
api:dashboard:view使用非标准操作名称"view"- 访问dashboard资源时需要考虑操作名映射问题
debug调试:
- 测试页面提供了详细的调试信息,包括权限检查结果和授权详情
- 后端日志记录了详细的授权过程