权限表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
权限表设计
2009-09-21 16:14
最简单的权限验证,应该是登录态的验证,如果登录,则可以怎样,没有登录,则不能怎样:
if ($isLogin === true) {
//do something
} else {
//do nothing
}
一般使用会话或者Cookie来保存登录态,具体实现不在此文讨论范围。一般权限都和人挂勾,首先识别你是谁,然后看你有能力做什么,然后再确认你的能力在这个地方是否可以使,一个权限验证算是基本上完成。我们围绕这几点来看权限如何去设计。
首先要能识别操作者是何许人,我们需要一张保存操作者信息的表,也就是通常所说的用户表。简单的用户表如下:
CREATE TABLE user (
userId int(10) unsigned NOT NULL,
username varchar(255) NOT NULL,
PRIMARY KEY (userId)
)
一般使用一个用户ID来标识一个唯一的用户,可以使用数字,或者直接使用用户名作为主键(如果用户名不重复)。这里我们使用userId来唯一标识一个用户。
有了用户以后,接下来需要确认这个用户所具有的能力,也就是权限,那么首先我们需要列一下我们的系统总共需要几个权限,比如增、删、改、查等。增加一张权限表:
CREATE TABLE permission (
permissionId int(10) unsigned NOT NULL ,
permissionName varchar(255) NOT NULL ,
PRIMARY KEY (permissionId)
)
同样的我们以permissionId作为主键来唯一标识一个权限,当然也可以使用permissionName来标识(如果你能确定唯一的话)。我们新增几条记录在这张表里:
+--------------+----------------+
| permissionId | permissionName |
+--------------+----------------+
| 1 | add |
| 2 | del |
| 3 | modify |
| 4 | select |
+--------------+----------------+
这里列举了4个权限,简单的表示我们的用户在系统里可能具有的增、删、改、查4种不同的能力。
接下来把这些能力赋给用户,需要一张对应表来保存:
CREATE TABLE userPermission (
userId int(10) unsigned NOT NULL,
permissionId int(10) unsigned NOT NULL,
PRIMARY KEY (userId, permissionId)
)
其中将userId和permissionId设置为主键,表示某个用户具有某种权限。表内容可能如下:
+--------+--------------+
| userId | permissionId |
+--------+--------------+
| 1 | 1 |
| 1 | 4 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
+--------+--------------+
以上权限配置表明用户1具有增、查权限,用户2具有增、删、改、查权限(嗯可以猜想用户1是个普通用户,用户2是个管理员)。
写到这里,我发现基本的用户权限系统雏型已经完成了。这么简单?看起来好像确实就是这么简单。一个用户拥有哪些权限,那么只需要勾选相应的权限分配给这个用户。在验证权限的时候,取出用户所拥有的所有权限,然后判断是否存在该权限即可。
实际上的权限设计要比这个复杂一些,到底复杂在哪里呢?我们接下来分析。当用户比较多而且权限数量比较多的时候,你是不是要每个用户都去勾选一堆权限呢?如何简化这个操作?OK,用户组的概念推出。所谓用户组,就是具有某些权限的一类人的集合。我们赋予用户组某些权限(角色表),然后把这个用户加到这个用户组里即可,来看看用户组长什么样子:
CREATE TABLE group (
groupId int(10) unsigned NOT NULL,
groupName varchar(255) NOT NULL,
PRIMARY KEY (groupId)
)
和用户表类似,我们需要标识一个唯一的组,这里分配一个组ID作为主键来标识。内容可能如下:
+---------+-----------+
| groupId | groupName |
+---------+-----------+
| 1 | user |
| 2 | admin |
+---------+-----------+
有了用户组表后,我们需要把一些权限赋给用户组,就需要一张用户组权限表:
CREATE TABLE groupPermission (
groupId int(10) unsigned NOT NULL,
permissionId int(10) unsigned NOT NULL,
PRIMARY KEY (groupId, permissionId)
)
我们分配增、查权限给user组,分配增、删、改、查权限给admin组:
+---------+--------------+
| groupId | permissionId |
+---------+--------------+
| 1 | 1 |
| 1 | 4 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 2 | 4 |
+---------+--------------+
用户组表和用户组所对应的权限表有了,那么要把用户分配给一个用户组,就需要一张用户和组的对应关系表:
CREATE TABLE userGroup (
userId int(10) unsigned NOT NULL,
groupId int(10) unsigned NOT NULL,
PRIMARY KEY (userId, groupId)
)
把用户1赋给user组,把用户2赋给admin组,和一开始我们直接分配权限一样:
+--------+---------+
| userId | groupId |
+--------+---------+
| 1 | 1 |
| 2 | 2 |
+--------+---------+
很明显这里的配置信息相对比userPermission表少很多,这里只需要记录用户属于什么组