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中计算时间差的几种方法
Dec 31 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
php定义数组和使用示例(php数组的定义方法)
Mar 29 PHP
php实现MySQL数据库备份与还原类实例
Dec 09 PHP
php 类自动载入的方法
Jun 03 PHP
php实现搜索一维数组元素并删除二维数组对应元素的方法
Jul 06 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
Feb 12 PHP
PHP实现的用户注册表单验证功能简单示例
Feb 25 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 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获取通过http协议post提交过来xml数据及解析xml
2012/12/16 PHP
PHP实现单例模式最安全的做法
2014/06/13 PHP
PHP安全下载文件的方法
2016/04/07 PHP
php简单实现多维数组排序的方法
2016/09/30 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
微信开发之获取JSAPI TICKET
2017/07/07 PHP
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
你必须知道的JavaScript 变量命名规则详解
2013/05/07 Javascript
14个有用的Jquery技巧分享
2015/01/08 Javascript
使用jquery制作弹出框效果
2015/04/03 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
python学习手册中的python多态示例代码
2014/01/21 Python
Python的Django框架中设置日期和字段可选的方法
2015/07/17 Python
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
Python使用pydub库对mp3与wav格式进行互转的方法
2019/01/10 Python
详解基于python-django框架的支付宝支付案例
2019/09/23 Python
Python批量将图片灰度化的实现代码
2020/04/11 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
素质拓展感言
2014/01/29 职场文书
大班上学期幼儿评语
2014/04/30 职场文书
销售行政专员岗位职责
2014/06/10 职场文书
井冈山红色之旅心得体会
2014/10/07 职场文书
委托书格式范文
2015/01/28 职场文书
英文投诉信格式
2015/07/03 职场文书
2015年高三年级组工作总结
2015/07/21 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL
opencv深入浅出了解机器学习和深度学习
2022/03/17 Python
MySQL三种方式实现递归查询
2022/04/18 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
2022/04/26 MySQL
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers
使用python生成大量数据写入es数据库并查询操作(2)
2022/09/23 Python