权限表设计
权限表设计
最简单的权限验证,应该是登录态的验证,如果登录,则可以怎样,没有登录,则不能怎样: 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是个管理员)。 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表少很多,这里只需要记录用户属于什么组就可以了,那么检测用户权限,就需要查出用户所在的组,然后再查出这个组(或者这些组)所拥有的权限,就可以得出用户所具备的权限,再进行验证即可。当然会比直接查询userPermission表绕一点点,不过相对比维护成本,这点点消耗不算什么。更何况我们其实仍然可以保存userPermission表,在分配用户组的时候,同时更新userPermission表即可。 CREATE TABLE userPermission ( userId int(10) unsigned NOT NULL, permissionId int(10) unsigned NOT NULL, has enum('yes','no') NOT NULL, PRIMARY KEY (userId, permissionId) ) 把用户1的增权限去掉,那么内容可能像这样: +--------+--------------+-----+ | userId | permissionId | has | +--------+--------------+-----+ | 1 | 1 | no | | 1 | 4 | yes | | 2 | 1 | yes | | 2 | 2 | yes | | 2 | 4 | yes | | 2 | 3 | yes | +--------+--------------+-----+ 这个用户依然在user组里,只不过user组所拥有的2个权限(add, select),他少了个add(ID为1被标记为no)权限而已。 CREATE TABLE userBoard ( userId int(10) unsigned NOT NULL, boardId int(10) unsigned NOT NULL, PRIMARY KEY (userId, boardId) ) 标记用户拥有哪些版块的管理权限,那么在严重用户拥有管理权限的时候,还要看当前版块是否是用户管辖内的版块,最终确定用户是否有操作权限。那么我将这类和业务逻辑相关的权限分配归到用户角色里,同样可以创建一系列角色,来管理用户所管辖的范围,比如超级版主,他也是具有管理删、改权限,只不过他的权限作用于全论坛,那么普通版主就需要指定论坛,这样来区分用户组和角色组我想会使整个权限系统更加清晰。 |