这是一个基于RBAC(基于角色的访问控制)的权限管理系统,集成了细粒度的权限控制、用户管理、命令执行审计和安全日志功能。系统通过预生成对象池优化性能,使用弱引用减少内存占用,并提供Prometheus监控指标支持。
- 四层权限控制:
- 用户直接权限
- 角色继承权限
- 命令执行权限要求
- 终端运行时权限检查
- 动态权限更新:权限变更时自动刷新用户权限缓存
- 关键操作审计日志(用户登录、权限变更、命令执行)
- JSON格式结构化日志记录
- 详细的错误追踪和权限验证失败记录
- 用户对象池预生成和复用
- 弱引用管理减少内存占用
- LRU缓存加速权限查询
- 线程安全设计(可重入锁)
- 命令执行统计(成功/失败/拒绝次数)
- 权限变更跟踪(授权/撤销)
- Prometheus指标端点(端口8000)
| 类名 | 功能描述 |
|---|---|
Permission |
权限实体,包含UUID、创建时间和关联命令 |
Role |
角色容器,支持权限继承和用户管理 |
User |
用户实体,支持登录验证、权限缓存和角色绑定 |
Command |
可执行命令,记录最后执行时间和所需权限 |
| 类名 | 功能描述 |
|---|---|
Manager |
中央管理器,负责权限/角色/命令的注册和关系维护 |
Terminal |
命令执行终端,绑定用户上下文并执行权限检查 |
PermissionChecker |
权限检查接口,支持自定义验证逻辑 |
| 类/机制 | 功能描述 |
|---|---|
UserPool |
用户对象池管理,支持对象复用 |
Logger |
审计日志系统,记录结构化JSON日志 |
| 弱引用机制 | 使用weakref管理对象关系,避免循环引用 |
| LRU缓存 | 用户权限查询缓存(@lru_cache) |
# 创建管理器
manager = Manager()
# 创建权限
read_permission = Permission("can_read")
manager.config_permission(read_permission)
# 创建角色
admin_role = Role("admin", read_permission)
manager.config_role(admin_role)# 创建用户(使用对象池)
user = UserPool.create_user("john", "securePwd123")
# 分配角色
manager.add_user_to_role(user, "admin")
# 直接授权
manager.issue(user, read_permission)# 定义命令函数
def read_data():
print("Reading sensitive data...")
# 注册命令
read_cmd = Command("read", read_data)
manager.add_command_to_permission(read_cmd, read_permission)
# 终端操作
terminal = Terminal(manager, DefaultChecker())
terminal.set_user(user)
terminal.run(read_cmd) # 执行权限检查# 撤销权限
manager.relieve(user, read_permission)
# 尝试执行命令(将触发PermissionError)
terminal.run(read_cmd)系统默认在8000端口提供Prometheus指标:
cmd_execute_total:命令执行计数器- 标签:
cmd_name,status(success/denied/error)
- 标签:
perm_changes_total:权限变更计数器- 标签:
action(grant/revoke)
- 标签:
{
"timestamp": "2023-08-08T15:22:45.123456",
"event_type": "permission_denied",
"user": "john",
"command": "read",
"missing_permissions": ["can_read"],
"required_permissions": ["can_read"],
"user_permissions": ["can_write"]
}-
对象池预生成:
# 预初始化100个用户对象 UserPool._pool.extend(User("", "") for _ in range(100))
-
内存优化:
- 使用
__slots__减少对象内存占用 - 弱引用管理对象关系(
WeakSet,WeakValueDictionary) - LRU缓存权限查询结果
- 使用
-
并发控制:
- 线程安全锁(
RLock)保护共享资源 - 原子操作保证数据一致性
- 线程安全锁(
- Python 3.7+
- 依赖包:
pip install prometheus_client
直接运行主文件:
python main.py监控端点:http://localhost:8000/metrics
代码包含完整测试用例,验证:
- 基础权限验证流程
- 角色权限继承
- 登录状态检查
- 权限撤销场景
- 错误处理机制
执行测试:
if __name__ == '__main__':
# 包含完整的测试流程
...- 用户登录状态30分钟过期
- 权限变更后需要调用
user.update()刷新缓存 - 避免直接删除User对象,应使用
delete()方法 - 命令执行需通过Terminal进行权限验证
- 实现自定义
PermissionChecker - 扩展Logger支持远程日志服务
- 添加用户会话管理模块
- 集成加密模块增强密码安全
系统设计文档详见代码注释,核心接口保持稳定,内部实现可根据需求调整。