9.2 KiB
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)目录
项目结构
项目采用分层架构设计,权限控制相关文件主要分布在configs/casbin/和internal/middleware/目录下。rbac_model.conf文件定义了基于Casbin的RBAC权限模型,而auth.go文件实现了JWT认证中间件,为权限系统提供用户身份验证。
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
图示来源
本节来源
核心组件
系统的核心权限控制组件包括Casbin权限模型配置、JWT认证中间件和用户服务。rbac_model.conf文件定义了请求定义、策略定义、角色定义、匹配器和策略效果等关键部分。auth.go文件中的AuthMiddleware函数实现了JWT认证逻辑,确保只有经过身份验证的用户才能访问受保护的资源。user_service.go文件中的用户服务函数处理用户注册、登录等操作,并在注册时为新用户分配默认角色。
本节来源
架构概述
系统采用基于Casbin的RBAC(基于角色的访问控制)权限模型。该模型通过rbac_model.conf文件定义,包含请求定义、策略定义、角色定义、匹配器和策略效果五个部分。JWT认证中间件负责用户身份验证,将用户信息存储在请求上下文中。用户服务处理用户相关的业务逻辑,并在注册时为用户分配角色。权限检查在中间件或服务层进行,通过将用户角色(role)与访问资源(obj)和操作(act)进行匹配来决定是否允许访问。
graph TD
A[客户端] --> B[JWT认证中间件]
B --> C{身份验证}
C --> |成功| D[权限检查]
C --> |失败| E[返回401]
D --> F{权限允许?}
F --> |是| G[执行操作]
F --> |否| H[返回403]
G --> I[返回结果]
图示来源
详细组件分析
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))表示只要存在一条允许的策略,就允许访问。
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))
}
图示来源
本节来源
JWT认证中间件分析
auth.go文件中的AuthMiddleware函数实现了JWT认证中间件。该中间件从请求头中提取JWT令牌,验证其有效性,并将用户信息存储在请求上下文中。OptionalAuthMiddleware函数提供了可选的JWT认证,允许未认证用户访问某些资源。这两个中间件为系统的权限控制提供了基础的身份验证功能。
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
图示来源
本节来源
用户服务分析
user_service.go文件中的RegisterUser函数处理用户注册逻辑。在创建用户时,该函数将用户的Role字段设置为"user",为新用户分配默认角色。LoginUser函数处理用户登录,验证用户名/邮箱和密码的正确性,并在成功登录后生成JWT令牌。这些服务函数与权限系统紧密集成,确保用户在注册和登录时正确地获得和验证其角色。
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
图示来源
本节来源
依赖分析
系统各组件之间存在明确的依赖关系。auth.go依赖于pkg/auth/jwt.go提供的JWT服务进行令牌验证。user_service.go依赖于repository/user_repository.go进行数据库操作,并依赖于pkg/auth/password.go进行密码加密。rbac_model.conf被Casbin引擎读取,用于定义权限模型。这些依赖关系确保了系统的模块化和可维护性。
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引擎]
图示来源
本节来源
性能考虑
系统的权限控制设计考虑了性能因素。JWT令牌在客户端存储,减少了服务器的认证开销。Casbin的权限检查算法经过优化,能够快速匹配权限策略。数据库查询使用了适当的索引,如casbin_rule表上的ptype、v0、v1索引,提高了权限检查的效率。对于高并发场景,可以考虑将权限策略缓存到Redis中,进一步提高性能。
故障排除指南
当遇到权限相关问题时,可以按照以下步骤进行排查:
- 检查JWT令牌是否正确生成和传递。
- 验证
rbac_model.conf文件的语法是否正确。 - 检查数据库中的
casbin_rule表是否包含正确的权限策略。 - 确认用户的角色是否正确分配。
- 查看系统日志,寻找权限拒绝的记录。
本节来源
结论
本系统采用基于Casbin的RBAC权限模型,通过rbac_model.conf文件定义权限策略,使用JWT认证中间件进行身份验证。该设计提供了灵活、可扩展的权限控制机制,能够满足不同场景下的权限管理需求。通过合理配置权限策略,可以实现细粒度的访问控制,确保系统的安全性。