上一篇
场景引入:
凌晨3点,运维小张被报警短信惊醒——某实习生误删了生产环境数据库表!😱 排查发现,这位"临时账号"竟拥有和Admin同款的"删库跑路"权限… 痛定思痛后,团队决定重构用户权限系统,今天我们就来聊聊,如何用科学的数据库设计筑起权限管理的防火墙!
权限失控的代价
用户组的优势
-- 用户表(含密码加密存储) CREATE TABLE `users` ( `user_id` BIGINT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(64) UNIQUE NOT NULL, `password_hash` CHAR(128) NOT NULL, -- 推荐argon2算法 `is_active` BOOLEAN DEFAULT TRUE, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB; -- 用户组表(部门/角色容器) CREATE TABLE `groups` ( `group_id` INT PRIMARY KEY, `group_name` VARCHAR(64) NOT NULL, `description` TEXT, `inheritable` BOOLEAN DEFAULT FALSE -- 是否允许权限继承 ); -- 权限项表(最小权限单元) CREATE TABLE `permissions` ( `perm_id` SMALLINT PRIMARY KEY, `perm_key` VARCHAR(32) UNIQUE NOT NULL, -- 如"order:delete" `description` VARCHAR(255) NOT NULL );
-- 用户-组关联(多对多) CREATE TABLE `user_group_mapping` ( `user_id` BIGINT, `group_id` INT, PRIMARY KEY (`user_id`, `group_id`), FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`), FOREIGN KEY (`group_id`) REFERENCES `groups`(`group_id`) ); -- 组-权限关联(带有效期控制) CREATE TABLE `group_permission_mapping` ( `group_id` INT, `perm_id` SMALLINT, `expires_at` DATETIME DEFAULT NULL, -- NULL表示永久有效 PRIMARY KEY (`group_id`, `perm_id`), FOREIGN KEY (`group_id`) REFERENCES `groups`(`group_id`), FOREIGN KEY (`perm_id`) REFERENCES `permissions`(`perm_id`) );
-- 权限继承表(实现RBAC层级) CREATE TABLE `group_inheritance` ( `child_group_id` INT, `parent_group_id` INT, PRIMARY KEY (`child_group_id`, `parent_group_id`), FOREIGN KEY (`child_group_id`) REFERENCES `groups`(`group_id`), FOREIGN KEY (`parent_group_id`) REFERENCES `groups`(`group_id`) ); -- 操作日志表(满足GDPR合规) CREATE TABLE `permission_audit_log` ( `log_id` BIGINT PRIMARY KEY AUTO_INCREMENT, `user_id` BIGINT NOT NULL, `target_entity` VARCHAR(128) NOT NULL, -- 被操作对象 `action_type` ENUM('CREATE','READ','UPDATE','DELETE'), `permission_used` VARCHAR(32) NOT NULL, `ip_address` VARCHAR(45), `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
权限粒度控制
order:view
和order:refund
) 动态权限方案
# 基于属性的访问控制(ABAC)示例 def check_access(user, resource, action): if user.department == '财务部' and resource.type == '发票': return action in ('view', 'export') return False
性能优化
不要做的事
推荐做法
:
就像给不同部门分配不同楼层的门禁卡,科学的用户组设计能让系统既安全又高效,2025年的今天,随着零信任架构普及,权限管理已从"能用就行"升级为"事关生死",现在动手优化,下次半夜被吵醒可能就是… 升职加薪的好消息啦!🎉
(注:本文数据库设计参考2025年OWASP权限管理白皮书及ISO/IEC 27002:2025标准)
本文由 帖宏毅 于2025-08-05发表在【云服务器提供商】,文中图片由(帖宏毅)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/545232.html
发表评论