# RBAC权限控制 **本文档引用的文件** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) - [auth.go](file://internal/middleware/auth.go) - [user_service.go](file://internal/service/user_service.go) - [user_repository.go](file://internal/repository/user_repository.go) - [audit_log.go](file://internal/model/audit_log.go) - [config.go](file://pkg/config/config.go) - [carrotskin_postgres.sql](file://scripts/carrotskin_postgres.sql) ## 目录 1. [项目结构](#项目结构) 2. [核心组件](#核心组件) 3. [架构概述](#架构概述) 4. [详细组件分析](#详细组件分析) 5. [依赖分析](#依赖分析) 6. [性能考虑](#性能考虑) 7. [故障排除指南](#故障排除指南) 8. [结论](#结论) ## 项目结构 项目采用分层架构设计,权限控制相关文件主要分布在`configs/casbin/`和`internal/middleware/`目录下。`rbac_model.conf`文件定义了基于Casbin的RBAC权限模型,而`auth.go`文件实现了JWT认证中间件,为权限系统提供用户身份验证。 ```mermaid graph TB subgraph "配置" rbac_model_conf[rbac_model.conf] end subgraph "中间件" auth_go[auth.go] end subgraph "服务层" user_service_go[user_service.go] end subgraph "数据模型" audit_log_go[audit_log.go] end rbac_model_conf --> auth_go auth_go --> user_service_go user_service_go --> audit_log_go ``` **图示来源** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) - [auth.go](file://internal/middleware/auth.go) - [user_service.go](file://internal/service/user_service.go) - [audit_log.go](file://internal/model/audit_log.go) **本节来源** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) - [auth.go](file://internal/middleware/auth.go) ## 核心组件 系统的核心权限控制组件包括Casbin权限模型配置、JWT认证中间件和用户服务。`rbac_model.conf`文件定义了请求定义、策略定义、角色定义、匹配器和策略效果等关键部分。`auth.go`文件中的`AuthMiddleware`函数实现了JWT认证逻辑,确保只有经过身份验证的用户才能访问受保护的资源。`user_service.go`文件中的用户服务函数处理用户注册、登录等操作,并在注册时为新用户分配默认角色。 **本节来源** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) - [auth.go](file://internal/middleware/auth.go) - [user_service.go](file://internal/service/user_service.go) ## 架构概述 系统采用基于Casbin的RBAC(基于角色的访问控制)权限模型。该模型通过`rbac_model.conf`文件定义,包含请求定义、策略定义、角色定义、匹配器和策略效果五个部分。JWT认证中间件负责用户身份验证,将用户信息存储在请求上下文中。用户服务处理用户相关的业务逻辑,并在注册时为用户分配角色。权限检查在中间件或服务层进行,通过将用户角色(role)与访问资源(obj)和操作(act)进行匹配来决定是否允许访问。 ```mermaid graph TD A[客户端] --> B[JWT认证中间件] B --> C{身份验证} C --> |成功| D[权限检查] C --> |失败| E[返回401] D --> F{权限允许?} F --> |是| G[执行操作] F --> |否| H[返回403] G --> I[返回结果] ``` **图示来源** - [auth.go](file://internal/middleware/auth.go) ## 详细组件分析 ### RBAC模型配置分析 `rbac_model.conf`文件定义了系统的权限模型。请求定义`r = sub, obj, act`表示权限检查请求包含主体(用户或角色)、对象(资源)和动作(操作)三个部分。策略定义`p = sub, obj, act`定义了权限策略的结构。角色定义`g = _, _`用于建立角色继承关系。匹配器`m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act`是权限检查的核心逻辑,它首先通过`g(r.sub, p.sub)`检查请求主体是否具有策略主体的角色,然后检查请求的对象和动作是否与策略匹配。策略效果`e = some(where (p.eft == allow))`表示只要存在一条允许的策略,就允许访问。 ```mermaid classDiagram class RBACModel { +request_definition : r = sub, obj, act +policy_definition : p = sub, obj, act +role_definition : g = _, _ +matchers : m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act +policy_effect : e = some(where (p.eft == allow)) } ``` **图示来源** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) **本节来源** - [rbac_model.conf](file://configs/casbin/rbac_model.conf) ### JWT认证中间件分析 `auth.go`文件中的`AuthMiddleware`函数实现了JWT认证中间件。该中间件从请求头中提取JWT令牌,验证其有效性,并将用户信息存储在请求上下文中。`OptionalAuthMiddleware`函数提供了可选的JWT认证,允许未认证用户访问某些资源。这两个中间件为系统的权限控制提供了基础的身份验证功能。 ```mermaid sequenceDiagram participant Client as 客户端 participant Middleware as 认证中间件 participant JWTService as JWT服务 Client->>Middleware : 发送请求(Authorization头) Middleware->>Middleware : 检查Authorization头 alt 头部不存在 Middleware-->>Client : 返回401(缺少Authorization头) else 有效格式 Middleware->>JWTService : 验证令牌 alt 令牌有效 JWTService-->>Middleware : 返回用户声明 Middleware->>Middleware : 将用户信息存入上下文 Middleware->>Client : 继续处理请求 else 令牌无效 Middleware-->>Client : 返回401(无效的token) end end ``` **图示来源** - [auth.go](file://internal/middleware/auth.go) **本节来源** - [auth.go](file://internal/middleware/auth.go) ### 用户服务分析 `user_service.go`文件中的`RegisterUser`函数处理用户注册逻辑。在创建用户时,该函数将用户的`Role`字段设置为"user",为新用户分配默认角色。`LoginUser`函数处理用户登录,验证用户名/邮箱和密码的正确性,并在成功登录后生成JWT令牌。这些服务函数与权限系统紧密集成,确保用户在注册和登录时正确地获得和验证其角色。 ```mermaid flowchart TD Start([注册用户]) --> CheckUsername["检查用户名是否已存在"] CheckUsername --> UsernameExists{"用户名已存在?"} UsernameExists --> |是| ReturnError1["返回错误: 用户名已存在"] UsernameExists --> |否| CheckEmail["检查邮箱是否已存在"] CheckEmail --> EmailExists{"邮箱已存在?"} EmailExists --> |是| ReturnError2["返回错误: 邮箱已被注册"] EmailExists --> |否| HashPassword["加密密码"] HashPassword --> CreateAvatar["确定头像URL"] CreateAvatar --> CreateUser["创建用户(角色=user)"] CreateUser --> GenerateToken["生成JWT Token"] GenerateToken --> ReturnSuccess["返回用户信息和Token"] ReturnError1 --> End([结束]) ReturnError2 --> End ReturnSuccess --> End ``` **图示来源** - [user_service.go](file://internal/service/user_service.go) **本节来源** - [user_service.go](file://internal/service/user_service.go) ## 依赖分析 系统各组件之间存在明确的依赖关系。`auth.go`依赖于`pkg/auth/jwt.go`提供的JWT服务进行令牌验证。`user_service.go`依赖于`repository/user_repository.go`进行数据库操作,并依赖于`pkg/auth/password.go`进行密码加密。`rbac_model.conf`被Casbin引擎读取,用于定义权限模型。这些依赖关系确保了系统的模块化和可维护性。 ```mermaid graph TD A[auth.go] --> B[jwt.go] C[user_service.go] --> D[user_repository.go] C --> E[password.go] F[rbac_model.conf] --> G[Casbin引擎] ``` **图示来源** - [auth.go](file://internal/middleware/auth.go) - [user_service.go](file://internal/service/user_service.go) - [user_repository.go](file://internal/repository/user_repository.go) - [rbac_model.conf](file://configs/casbin/rbac_model.conf) **本节来源** - [auth.go](file://internal/middleware/auth.go) - [user_service.go](file://internal/service/user_service.go) - [user_repository.go](file://internal/repository/user_repository.go) - [rbac_model.conf](file://configs/casbin/rbac_model.conf) ## 性能考虑 系统的权限控制设计考虑了性能因素。JWT令牌在客户端存储,减少了服务器的认证开销。Casbin的权限检查算法经过优化,能够快速匹配权限策略。数据库查询使用了适当的索引,如`casbin_rule`表上的`ptype`、`v0`、`v1`索引,提高了权限检查的效率。对于高并发场景,可以考虑将权限策略缓存到Redis中,进一步提高性能。 ## 故障排除指南 当遇到权限相关问题时,可以按照以下步骤进行排查: 1. 检查JWT令牌是否正确生成和传递。 2. 验证`rbac_model.conf`文件的语法是否正确。 3. 检查数据库中的`casbin_rule`表是否包含正确的权限策略。 4. 确认用户的角色是否正确分配。 5. 查看系统日志,寻找权限拒绝的记录。 **本节来源** - [auth.go](file://internal/middleware/auth.go) - [rbac_model.conf](file://configs/casbin/rbac_model.conf) - [audit_log.go](file://internal/model/audit_log.go) ## 结论 本系统采用基于Casbin的RBAC权限模型,通过`rbac_model.conf`文件定义权限策略,使用JWT认证中间件进行身份验证。该设计提供了灵活、可扩展的权限控制机制,能够满足不同场景下的权限管理需求。通过合理配置权限策略,可以实现细粒度的访问控制,确保系统的安全性。