php下的权限算法的实现


Posted in PHP onApril 28, 2007

权限设计

大概有这几种模式:
用户+组+角色+权限
用户+组+权限
用户+角色+权限
用户+权限

最近看了别人的设计方法,大多以“整数”来表示权限值,如添加、浏览、删除和修改,分别用1、2、4、8这几个整数来代替,不过,各人的做法有所不同,举例如下:

1.用2的n次幂组成权限值的集合,如1、2、4、8、16...,某用户的权限值为其子集中的整数之和,如 7=1+2+4,5=1+4。如果要从数据库检索包含某几种权限的用户,则先把这几种权限值相加,假设和为k,然后select * from table where 1 and 用户权限值 = ’k’;如果要判断某用户有哪些权限,则取出其权限值k,分别用k&1,K&2,K&4,k&16...,如果为真,则表示有值等于“&”右边整数的权限,例如,如果k&4为真,则此用户有权限表中值等于4的权限;

2.用质数2、3、5、7、11...组成权限集合,某用户的权限为其子集中各整数的乘积,如 210 = 2*3*5*7,我觉得这种方法很有趣,难点在于如何分解质因数;但我有些不认同原作者的提法,他认为权限之间可能存在包含关系,如某用户有删除权限,则其一定有浏览权限,要不然就没法删除,事实确实是这样,不过我认为这样太复杂了,容易出错,我觉得权限最好是“原子”的,互不干扰,也就是说某用户有删除权限而没浏览权限则其无法进行删除操作,因为他看不到东西,解决这个矛盾的关键是在给用户赋权时,把浏览权限也赋给他;

3.不用整数,而是用“向量表”方法(也许我说的不一定对),把所有可能的权限按一定的顺序排列,如添加、浏览、修改、删除...,用户的权限值为固定100位长度的字符串,如100010100001....01,从左起每一位对应一种操作权限,如果有这种权限,则此位的值为1,反之,则为0,作者之所以把用户权限值固定为100位,我想是考虑到升级问题,但我认为这还不够科学,我认为用户的权限值长度应小于权限个数,举例如下:
权限排列表:添加、浏览、修改、删除,用户A有添加和浏览的的权限,则其权限值为11,用户B有浏览和修改的权限则其权限值为011,用户C有浏览和删除的权限则其权限值为0101,这样设计的好处为:当权限表中增加别的权限时,不会影响用户表或角色表;

4.我曾经的做法,在后台管理中把权限分为两大类:栏目权限和操作权限,每个栏目对应一个目录,操作权限细分为浏览、添加、修改和删除,用户进入系统后首先判断有没有栏目权限,然后判断有没有操作权限,判断栏目权限相对简单一些,首先获取访问页面的路径path,然后分解出目录,对应用户拥有的目录权限,如果此目录包含在用户有权管理的目录数组中(从数据库取出),则其有进入此目录的权限,否则,没有,然而,在判断操作权限好象有些麻烦,但突然想到添加、浏览、修改和删除与我的文件命名规则是基本是对应的,但有点不同的是,我把添加和删除的功能合并在一个文件中了,例如文件名为proAddEdit.php,幸好意识到修改文件时多了个传递参数id,于是,我用正则解决了这个问题,今天看来,这种方法似乎过时了,因为不适应面向对象的思想和用框架体系来开发系统!

以上是个人粗浅的认识和描述,若有错误,请各位指正,希望高人给些意见! 

PHP 相关文章推荐
php抓取页面与代码解析 推荐
Jul 23 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
PHP is_subclass_of函数的一个BUG和解决方法
Jun 01 PHP
深入讲解PHP Session及如何保持其不过期的方法
Aug 18 PHP
学习php设计模式 php实现装饰器模式(decorator)
Dec 07 PHP
thinkPHP模板算术运算相关函数用法分析
Jul 12 PHP
php封装的数据库函数与用法示例【参考thinkPHP】
Nov 08 PHP
php安装dblib扩展,连接mssql的具体步骤
Mar 02 PHP
详解PHP如何更好的利用PHPstorm的自动提示
Aug 18 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
laravel中的fillable和guarded属性详解
Oct 23 PHP
PHP设计模式(七)组合模式Composite实例详解【结构型】
May 02 PHP
php 中的str_replace 函数总结
Apr 27 #PHP
解决php中Cannot send session cache limiter 的问题的方法
Apr 27 #PHP
escape unescape的php下的实现方法
Apr 27 #PHP
mysql 全文搜索 技巧
Apr 27 #PHP
mysql 搜索之简单应用
Apr 27 #PHP
mysql 字段类型说明
Apr 27 #PHP
Discuz! 5.0.0论坛程序中加入一段js代码,让会员点击下载附件前自动弹出提示窗口
Apr 18 #PHP
You might like
PHP结合Mysql数据库实现留言板功能
2016/03/04 PHP
利用PHP抓取百度阅读的方法示例
2016/12/18 PHP
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JS实现当前页居中分页效果的方法
2015/06/18 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
js实现不重复导入的方法
2016/03/02 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
JavaScript实现弹出广告功能
2017/03/30 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
[00:44]2016完美“圣”典 风云人物:Mikasa宣传片
2016/12/07 DOTA
跟老齐学Python之再深点,更懂list
2014/09/20 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
全面了解django的缓存机制及使用方法
2019/07/22 Python
Python closure闭包解释及其注意点详解
2019/08/28 Python
python无序链表删除重复项的方法
2020/01/17 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
英国领先的运动营养品牌:Protein Dynamix
2018/01/02 全球购物
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
运动会通讯稿200字
2014/02/16 职场文书
求职意向书
2014/04/01 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
财政局个人总结
2015/03/04 职场文书
小学生节水倡议书
2015/04/29 职场文书
房产证明范本
2015/06/19 职场文书