goframe开发一个企业网站 权限设计1
基于RBAC的权限管理系统设计
1. 引言
在现代应用程序开发中,权限管理是一个至关重要的组成部分。本文将介绍一个基于角色的访问控制(Role-Based Access Control,RBAC)系统的初期数据库设计,该设计旨在为各种类型的应用提供灵活而强大的权限管理解决方案。
需要注意的是,这是一个初步设计,随着项目的发展和需求的变化,字段和表结构可能需要进行调整和优化。
2. 系统概述
我们的RBAC系统主要包含以下几个核心概念:
- 用户(User):系统的使用者,可以是学生、教师、管理员等。
- 角色(Role):用户在系统中的身份,如学生、教师、教学管理员、系统管理员等。
- 权限(Permission):用户可以执行的操作。
- 菜单(Menu):系统的功能模块,与权限相关联。
3. 初期数据库设计
以下是初步的数据库设计,后续可能需要根据实际需求进行调整:
3.1 用户表(user)
用户表存储了系统中所有用户的基本信息。
字段名 | 类型 | 说明 |
---|---|---|
id | INT | 用户ID,自增主键 |
username | VARCHAR(50) | 用户名,唯一 |
password | VARCHAR(255) | 密码,建议使用加密存储 |
VARCHAR(100) | 用户邮箱 | |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 最后更新时间 |
3.2 角色表(role)
角色表定义了系统中的各种角色。
字段名 | 类型 | 说明 |
---|---|---|
id | INT | 角色ID,自增主键 |
name | VARCHAR(50) | 角色名称,唯一 |
description | VARCHAR(255) | 角色描述 |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 最后更新时间 |
3.3 用户角色关联表(user_role)
此表建立了用户和角色之间的多对多关系。
字段名 | 类型 | 说明 |
---|---|---|
user_id | INT | 用户ID,关联user表的id |
role_id | INT | 角色ID,关联role表的id |
3.4 菜单表(menu)
菜单表存储了系统的功能模块信息。
字段名 | 类型 | 说明 |
---|---|---|
id | INT | 菜单ID,自增主键 |
name | VARCHAR(50) | 菜单名称 |
url | VARCHAR(255) | 菜单URL |
parent_id | INT | 父菜单ID,用于构建菜单层级 |
order_num | INT | 菜单顺序 |
icon | VARCHAR(50) | 菜单图标 |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 最后更新时间 |
3.5 权限表(permission)
权限表定义了系统中的各种操作权限。
字段名 | 类型 | 说明 |
---|---|---|
id | INT | 权限ID,自增主键 |
name | VARCHAR(50) | 权限名称,唯一 |
description | VARCHAR(255) | 权限描述 |
menu_id | INT | 关联的菜单ID |
created_at | TIMESTAMP | 创建时间 |
updated_at | TIMESTAMP | 最后更新时间 |
3.6 角色权限关联表(role_permission)
此表建立了角色和权限之间的多对多关系。
字段名 | 类型 | 说明 |
---|---|---|
role_id | INT | 角色ID,关联role表的id |
permission_id | INT | 权限ID,关联permission表的id |
4. 系统功能实现
4.1 用户权限分配
管理员可以通过以下步骤为用户分配权限:
- 在role表中创建或选择适当的角色。
- 在role_permission表中为该角色分配相应的权限。
- 在user_role表中将用户与角色关联。
4.2 权限验证
在进行用户认证时,系统可以通过以下步骤获取用户的权限数据:
- 根据用户ID从user_role表中获取该用户的所有角色。
- 根据获取到的角色ID,从role_permission表中获取这些角色所拥有的所有权限ID。
- 根据权限ID从permission表中获取具体的权限信息。
5. 未来可能的调整
随着项目的发展,可能需要考虑以下方面的调整:
- 添加更多的用户信息字段,如姓名、电话、状态等。
- 增加权限的粒度,可能需要添加资源表和操作表。
- 考虑添加部门或组织结构相关的表,以支持更复杂的权限管理需求。
- 优化查询性能,可能需要添加适当的索引或引入缓存机制。
- 根据业务需求,可能需要添加日志表来记录权限变更历史。
- 考虑数据安全性,可能需要对敏感信息进行加密存储。
6. mysql 语
-- 用户表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID,自增主键',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名,唯一',
password VARCHAR(255) NOT NULL COMMENT '密码,建议使用加密存储',
email VARCHAR(100) COMMENT '用户邮箱',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间'
) COMMENT '存储系统用户信息';
-- 角色表
CREATE TABLE role (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '角色ID,自增主键',
name VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称,唯一',
description VARCHAR(255) COMMENT '角色描述',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间'
) COMMENT '存储系统角色信息';
-- 用户角色关联表
CREATE TABLE user_role (
user_id INT COMMENT '用户ID,关联user表的id',
role_id INT COMMENT '角色ID,关联role表的id',
PRIMARY KEY (user_id, role_id),
FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE,
FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE
) COMMENT '用户和角色的多对多关联表';
-- 菜单表
CREATE TABLE menu (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '菜单ID,自增主键',
name VARCHAR(50) NOT NULL COMMENT '菜单名称',
url VARCHAR(255) COMMENT '菜单URL',
parent_id INT COMMENT '父菜单ID,用于构建菜单层级',
order_num INT COMMENT '菜单顺序',
icon VARCHAR(50) COMMENT '菜单图标',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
FOREIGN KEY (parent_id) REFERENCES menu(id) ON DELETE SET NULL
) COMMENT '存储系统菜单信息';
-- 权限表
CREATE TABLE permission (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '权限ID,自增主键',
name VARCHAR(50) NOT NULL UNIQUE COMMENT '权限名称,唯一',
description VARCHAR(255) COMMENT '权限描述',
menu_id INT COMMENT '关联的菜单ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
FOREIGN KEY (menu_id) REFERENCES menu(id) ON DELETE SET NULL
) COMMENT '存储系统权限信息';
-- 角色权限关联表
CREATE TABLE role_permission (
role_id INT COMMENT '角色ID,关联role表的id',
permission_id INT COMMENT '权限ID,关联permission表的id',
PRIMARY KEY (role_id, permission_id),
FOREIGN KEY (role_id) REFERENCES role(id) ON DELETE CASCADE,
FOREIGN KEY (permission_id) REFERENCES permission(id) ON DELETE CASCADE
) COMMENT '角色和权限的多对多关联表';
CREATE TABLE `web_user`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`nickname` varchar(20) COLLATE utf8mb4_general_ci NOT NULL COMMENT '昵称',
`username` varchar(10) COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名',
`password` varchar(32) COLLATE utf8mb4_general_ci NOT NULL COMMENT '密码',
`avatar` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '头像',
`email` varchar(128) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '邮箱',
`last_ip` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '登录ip',
`join_ip` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '注册ip',
`login_time` datetime DEFAULT NULL COMMENT '登录时间',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`),
UNIQUE KEY `email` (`email`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户表';
CREATE TABLE `web_nav`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'url',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='导航菜单';
CREATE TABLE `web_site`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(50) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '名称',
`url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT 'url',
`remark` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='友情链接';
CREATE TABLE `web_article_cate`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
`keywords` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关键词',
`description` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`is_show` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否展示 1展示 2不展示',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章分类';
CREATE TABLE `web_article_tag`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '分类名称',
`remark` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '备注',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章标签';
CREATE TABLE `web_article`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`cate_id` int NOT NULL DEFAULT '0' COMMENT '分类id',
`title` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
`cover` varchar(100) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '封面图',
`keywords` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '关键词',
`description` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`views` int NOT NULL DEFAULT '0' COMMENT '浏览量',
`is_show` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否展示 1展示 2不展示',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `cate_id` (`cate_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章';
CREATE TABLE `web_article_content`
(
`article_id` int NOT NULL COMMENT '文章id',
`content` mediumtext COLLATE utf8mb4_general_ci COMMENT '内容',
PRIMARY KEY (`article_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章内容';
CREATE TABLE `web_article_to_tag`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`article_id` int NOT NULL COMMENT '文章id',
`tag_id` int NOT NULL COMMENT '标签id',
PRIMARY KEY (`id`) USING BTREE,
KEY `article_id` (`article_id`),
KEY `tag_id` (`tag_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章关联标签';
CREATE TABLE `web_article_comment`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_id` int NOT NULL COMMENT '用户id',
`article_id` int NOT NULL COMMENT '文章id',
`tid` int NOT NULL DEFAULT '0' COMMENT '顶级id',
`pid` int NOT NULL DEFAULT '0' COMMENT '上级id',
`content` text COLLATE utf8mb4_general_ci NOT NULL COMMENT '内容',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `article_id` (`article_id`),
KEY `tid` (`tid`),
KEY `pid` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='文章评论';
CREATE TABLE `web_project`
(
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键',
`title` varchar(15) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题',
`description` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '描述',
`url` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '项目地址',
`tags` varchar(255) COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标签',
`github` varchar(255) NOT NULL DEFAULT '' COMMENT 'github项目',
`sort` int NOT NULL DEFAULT '0' COMMENT '排序',
`created_at` datetime DEFAULT NULL COMMENT '创建时间',
`updated_at` datetime DEFAULT NULL COMMENT '更新时间',
`deleted_at` datetime DEFAULT NULL COMMENT '删除时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='项目';
CREATE TABLE `web_config`
(
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`content` mediumtext COLLATE utf8mb4_general_ci COMMENT '内容json',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统配置';
-- 初始化数据 --
INSERT INTO `web_nav` (`id`, `name`, `url`, `sort`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 'Me', '/me', 0, now(), now(), NULL);
INSERT INTO `web_nav` (`id`, `name`, `url`, `sort`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, '项目', '/projects', 0, now(), now(), NULL);
INSERT INTO `web_article` (`id`, `cate_id`, `title`, `cover`, `description`, `keywords`, `views`, `sort`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, 0, '文章标题', '', '文章标题描述', '文章标题关键字', 0, 0, now(), now(), NULL);
INSERT INTO `web_article_content` (`article_id`, `content`) VALUES (1, '文章内容');
INSERT INTO `web_article_tag` (`id`, `name`, `remark`, `sort`, `created_at`, `updated_at`, `deleted_at`) VALUES (1, '标签1', '标签1', 0, now(), now(), NULL);
INSERT INTO `web_article_tag` (`id`, `name`, `remark`, `sort`, `created_at`, `updated_at`, `deleted_at`) VALUES (2, '标签2', '标签2', 0, now(), now(), NULL);
6. 结论
本文介绍的RBAC权限管理系统初期设计提供了一个灵活且可扩展的解决方案。通过合理使用用户、角色、权限和菜单的概念,我们可以构建一个强大的权限管理系统,满足各种复杂的业务需求。
需要强调的是,这只是一个初步的设计方案。在实际应用中,我们需要根据具体的业务需求和系统规模来不断调整和优化数据库结构。同时,也要考虑到性能、安全性、可维护性等因素,以确保系统能够长期稳定运行并满足不断变化的需求。