权限表设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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表少很多,这里只需要记录用户属于什么组

相关文档
最新文档