衆所周知,權限系統是每個系統裏面必備的最基本的系統,然而權限系統設計有時挺麻煩的,,現在整理了下,給正在開發此模塊的朋友一個思路!
設計基礎:用戶、角色、權限三大核心表,加上用戶角色、角色權限兩個映射表(用於給用戶表聯繫上權限表)。這樣就可以通過登錄的用戶來獲取權限列表,或判斷是否擁有某個權限。
一,各個表格
1、用戶表
CREATE TABLE `t_user` (
`id` varchar(40) NOT NULL,
`username` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
)
2、角色表
CREATE TABLE `t_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
3、權限表
CREATE TABLE `t_permission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
4、用戶角色關係表
CREATE TABLE `user_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(40) NOT NULL,
`role_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_user_role_t_role_1` (`role_id`),
KEY `fk_user_role_t_user_1` (`user_id`),
CONSTRAINT `fk_user_role_t_role_1` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_user_role_t_user_1` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
5、角色權限關係表
CREATE TABLE `role_permission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL,
`permission_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_role_permission_t_permission_1` (`permission_id`),
KEY `fk_role_permission_t_role_1` (`role_id`),
CONSTRAINT `fk_role_permission_t_permission_1` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_role_permission_t_role_1` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
6、測試數據
INSERT INTO `role_permission` VALUES ('1','1','1'), ('2','2','2'), ('3','3','3');
INSERT INTO `t_permission` VALUES ('1','小說收藏',NULL), ('2','小說發佈',NULL), ('3','廣告發布',NULL);
INSERT INTO `t_role` VALUES ('1','讀者',NULL), ('2','作者',NULL), ('3','管理員',NULL);
INSERT INTO `t_user` VALUES ('u1','reader'), ('u11','reader1'), ('u2','author'), ('u22','author2'), ('u3','admin'), ('u33','admin2');
INSERT INTO `user_role` VALUES ('1','u1','1'), ('2','u2','2'), ('3','u3','3'), ('4','u11','1'), ('5','u22','2'), ('6','u33','3');
小說網站,用戶表的設計。
用戶有着“讀者”,“作者”和“管理員”角色,角色有不同權限,如小說收藏,小說發佈和廣告發布
假定,用戶和角色是一對一關係,即一個用戶只有一個角色;角色和用戶的關係是一對多關係,一個角色對應着多個用戶。(方便後面對應英文單詞直觀反應着關係,如看到reader就是表示讀者角色)
角色和權限的關係是多對多關係。即一個角色有着多種權限,同樣,一個權限可以分給不同角色。
二、多對多查詢
1、查詢擁有某角色的用戶信息
SELECT
u.id,u.username
FROM
t_user u,t_role r,user_role ur
WHERE
r.id=1 AND r.id=ur.role_id AND ur.user_id=u.id;
2、查詢某用戶的對應的角色。
SELECT
u.id,u.username,r.`name` role_name
FROM
t_user u,t_role r,user_role ur
WHERE
u.username LIKE 'a%' AND u.id=ur.user_id AND ur.role_id=r.id;
3、查詢擁有某權限的角色
SELECT p.`name`,r.`name`
FROM
t_permission p,role_permission rp,t_role r
WHERE
p.`name`='小說發佈' AND p.id=rp.permission_id AND rp.role_id=r.id;
4、查詢某角色擁有的權限。
SELECT r.`name`,p.`name`
FROM
t_permission p,role_permission rp,t_role r
WHERE
r.`name`='作者' AND r.id=rp.role_id AND rp.permission_id=p.id;
5、查詢某用戶擁有的權限。
這裏用戶和角色是一對一關係,通過先查詢用戶的角色,再查詢權限。(單行單例子查詢)
SELECT p.`name`
FROM
t_permission p,role_permission rp,t_role r
WHERE
r.id=rp.role_id AND rp.permission_id=p.id AND r.id
IN
(SELECT r.id
FROM
t_user u,t_role r,user_role ur
WHERE
u.username ='author' AND u.id=ur.user_id AND ur.role_id=r.id);
6.查詢擁有某權限的用戶
權限與角色是多對多關係,角色和用戶是一對一關係。
這個是查詢是多行單列子查詢
SELECT
u.id,u.username
FROM
t_user u,t_role r,user_role ur
WHERE
r.id=ur.role_id AND ur.user_id=u.id AND r.id
IN
(SELECT r.id
FROM
t_permission p,role_permission rp,t_role r
WHERE
p.`name`='小說發佈' AND p.id=rp.permission_id AND rp.role_id=r.id);