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 相关文章推荐
DedeCms模板安装/制作概述
Mar 11 PHP
PHP在字符串中查找指定字符串并删除的代码
Oct 02 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
php实现给图片加灰色半透明效果的方法
Oct 20 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
php实现有趣的人品测试程序实例
Jun 08 PHP
深入理解PHP 数组之count 函数
Jun 13 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
Sep 22 PHP
PHP用continue跳过本次循环中剩余代码的注意点
Jun 27 PHP
微信开发之获取JSAPI TICKET
Jul 07 PHP
PHP __call()方法实现委托示例
May 20 PHP
PHP实现基于状态的责任链审批模式详解
May 31 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使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
javascript白色简洁计算器
2015/05/04 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
基于vue hash模式微信分享#号的解决
2020/09/07 Javascript
[00:53]2015国际邀请赛 中国区预选赛一触即发
2015/05/14 DOTA
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python中的ceil()方法使用教程
2015/05/14 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
pyspark.sql.DataFrame与pandas.DataFrame之间的相互转换实例
2018/08/02 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
django页面跳转问题及注意事项
2019/07/18 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
澳大利亚新奇小玩意网站:Yellow Octopus
2017/12/28 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
英语专业职业生涯规划范文
2014/03/05 职场文书
租赁协议书范本
2014/04/22 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
先进班集体申报材料
2014/12/26 职场文书
名人传读书笔记
2015/06/26 职场文书
Apache Hudi集成Spark SQL操作hide表
2022/03/31 Servers
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL