SNS类型的网站都会给不同用户组的用户设置不同的权限,而且,大型的SNS网站所涉及的权限又有很多。给出两种设计思路,供大家参考与谈论:
思路一:
这是一种自认为比较庸俗的设计,而且不可避免的产生很多冗余以及占用不必要的数据库资源。但是,仍旧是我早期非常菜的一种利用方法,在平时练习,对权限较少的情形下还是可以接管的。详细思路是用bool类型‘0’代表不具备当前的权限,‘1’代表具备当前的权限。将用户表中的用户信息与权限表关联,当数据库中某个用户某个权限的对应值为‘1’表示当前用户具备当前权限,反之,则不具备当前权限。以此办法来掌握用户的可操作权限。
思路二:
思路二采取位运算实现权限掌握,这是一种比较科学的设计办法。大致思路是用二进制(或十进制)数字表示相应的权限,比如:文章添加权限用二进制‘1’(十进制1)表示;文章编辑权限用二进制‘10’(十进制2)表示;文章删除权限用二进制‘100’(十进制4)表示等等。
在PHP中要判断一个数是否在某些数的范围内可以利用&运算符。比如:15=1+2+4+8,则15&4、15&8的返回值都为真,而15&16的返回值就为假。那么,我们可以定义一些常量代表权限,十进制数字演示代码如下:
<?phpdefine(\公众ADD\"大众, 1);define(\"大众DEL\"大众, 2);define(\"大众UPD\公众, 4);define(\公众SEL\公众, 8);echo $all_access=ADD | DEL | UPD | SEL;?>
ADD代表增加权限,DEL代表删除权限;UPD代表更新权限;SEL代表删除权限,则$all_access输出值为15,代表具备全部权限。若想判断$all_access是否包含ADD权限,只须要用语句$all_access&ADD判断一下,运行可知,判断结果返回值为真,表示$all_access代表的权限集包含ADD权限。
【在数据库中的详细实现】
上述思路作为完成详细数据库设计的根本,数据库演示设计思路解释如下:
设计两个数据库表:用户基本信息表user_admin与用户组表user_group
两个表通过字段gro与name关联,user_group表中的user_shell存储权限和,例如类似上述代码中的$all_access的值。user_shell可存储十进制数,亦可存储二进制数,末了通过按位与运算判断当前用户是否具备实行某个操作的权限。