[共享]权限控制算法 有。你没有留意我以前问过的问题。当时唠叨给了详细的回答。采用并和或的方式来进行权限判断,可以使用几近无限的权限值。你看看ckong.cn吧。就是用的这个来判断的。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 君子兰)兄,似乎我没找到那篇文章,你保存了,能不能发给我,谢谢[email protected] 总共有操作0,1,2,3,4,5那么当用户有权限为 0,1,2,3,4时,那么他的purview=2^0+2^1+...+2^4=31现在要判断用户是否有权限5那么用 5(101)和31(11111)进行与则结果为5(101),说明用户有权限5,然而用户并没有权限5,这个是不是有问题? 根据以上思想,用php写了个权限判断的列子<?php//判断当前用户是否有操作权限function isPower($user_pValue, $curOpt){ if (pow(2,$curOpt) == ($user_pValue & pow(2,$curOpt))) { return true; } else { return false; }}//计算用户的权限值//参数$user_power形如0,1,2形式function userPowerValue($user_power){ $user_powerA=explode(",",$user_power); $user_pValue=0; foreach($user_powerA as $v) { $user_pValue+=pow(2,$v); } return $user_pValue;}//****************************************//权限判断$user_power="0,1,2,3,4,5"; //有权限0,1,2,3,4,5$userValue=userPowerValue($user_power); //计算用户权限总值$curOpt=33; //用户要进行的操作,判断是否有权限//判断一,输出无权if(isPower($userValue, $curOpt)){echo "有权";}else{echo "无权";}echo "<br>";//判断二,输出有权$curOpt=3;if(isPower($userValue, $curOpt)){echo "有权";}else{echo "无权";}?> 假设一个请求:index.php?option=ss&task=jji&act=ii那么其对应的权限是$auth[option_ss__task_jji__act_ii]=1; 假设一个请求:index.php?option=ss&task=jji&act=ii那么其对应的权限是$auth[option_ss__task_jji__act_ii]=1;这个会不会有安全问题?明摆着让人知道了。每个权限的值必须是“2”的整数倍吧?如果要设置20个权限,该值立马攀升到5242882^30也不过10位数而已,不怕的。有时候具体问题具体分析吧。只是偶看到这种方法比较好呀。共享出来和大家讨论了。。哈哈。差点儿忘记了楼上共享出函数的同学,其实也都是比较简单的函数嘛。不错不错。。 我不喜欢bit位转来转去的,而且很明显位定义很麻烦,赋权也麻烦。还是我的方案好。php的数组实在是太棒了。 就我个人而言,也是喜欢直接以一定排列值存在数据库里,然后取出来选择也方便。然后比较权限直接用个SESSION数组就可以了。bit方法就是不知道一个数值后,要知道全部权限分布,还得一个一个的检测,就一点麻烦些。。其它倒也好 用与的方法控制权限很好用的!<?phpdefine("AUTH_ADMINISTRATOR", 1);define("AUTH_SHOW", 2);define("AUTH_ADD", 4);define("AUTH_DELETE", 8);// 如果用户的权限为6 那么该用户是否有删的权限呢? --> 判断如下:if (AUTH_DELETE & 6){ exit(true);}else{ exit(false);}?> 对,就是稚鹰的做法。只不过把define改成了mysql就是了。对应着一个权限名称,一个权限id。id的值就是稚鹰这个里面的1、2、4、8 我还是喜欢将权限列一个表,相当于系统的每个对应的模块将模块对应一个数字,然后在管理员中分配这些模块的对应数字,如果有对应数字就说明有权限,反之亦然,具体实现起来可以将这些用数组看待,只要用in_array()作判断就可。看IPB论坛的后台可以得到一些启发。 这么简单的问题居然要使用幂运算?!mysql中有set类型,可存放64个标志位。 这么简单的问题居然要使用幂运算?!-----------------------set类型不是每种数据库都有的吧~而且"幂运算"的效率并不低 个人觉得基至比用set类型快~~~~~~因为都是与或运算````` linjianwu(飞天狐狸) ( ) 信誉:98 2006-03-07 09:18:00 得分: 0 当时在论坛里也看过。用二进制控制用户登陆系统的权限例子。前段机子硬盘挂了。数据都掉了。 有谁知道能不能共享一下。 ==============================我发的这个不算二进制吗? 我想了下这个问题,昨天在考虑一个有50个不同权限的系统时用这个肯定是不行了如果用户有1,2,3,4,5权限,假设当前要进行3权限的操作,我只用判断3是否在1,2,3,4,5这个数组里就行了,用in_array(),所以也就没有必要用2的n次方来解决啊,这样不是还增加的运算,导致效率低,直接用数组就行了啊?大家探讨下 to:zhiin(稚鹰@南通) 但是除了两数相与外还要进行2的n次方运算啊?这不需要时间吗?还有我的是50个权限,如果用数组来解决是不是最佳方法呢? 300分求将一个PHP写的功能改写成asp 用PHP、Mysql写网页一定要用到XML吗? PHP查询数据库效率问题 请教个php+ajax基础问题 PHP很幼稚的问题 用php准备做一个学生查分系统 为什么我下载的很多PHP程序没办法用? 网站项目,有兴趣者进来 老大些。。在WIN2K下如何配置php+apache啊!!在线等待!!发分了 ******请问怎样读写INI文件(基于linux,很急啊!)****** 现在公司有一台WEB服务器,接的是网通和铁通线路,网站的主要元素就是图片,我想问一下,有什么办法让这些图片下载快一些 多维数组的问题麻烦高手帮忙
//判断当前用户是否有操作权限
function isPower($user_pValue, $curOpt)
{
if (pow(2,$curOpt) == ($user_pValue & pow(2,$curOpt)))
{
return true;
}
else
{
return false;
}
}
//计算用户的权限值
//参数$user_power形如0,1,2形式
function userPowerValue($user_power)
{
$user_powerA=explode(",",$user_power);
$user_pValue=0;
foreach($user_powerA as $v)
{
$user_pValue+=pow(2,$v);
}
return $user_pValue;
}//****************************************
//权限判断$user_power="0,1,2,3,4,5"; //有权限0,1,2,3,4,5
$userValue=userPowerValue($user_power); //计算用户权限总值$curOpt=33; //用户要进行的操作,判断是否有权限//判断一,输出无权
if(isPower($userValue, $curOpt))
{
echo "有权";
}
else
{
echo "无权";
}echo "<br>";//判断二,输出有权
$curOpt=3;
if(isPower($userValue, $curOpt))
{
echo "有权";
}
else
{
echo "无权";
}
?>
index.php?option=ss&task=jji&act=ii
那么其对应的权限是
$auth[option_ss__task_jji__act_ii]=1;
index.php?option=ss&task=jji&act=ii
那么其对应的权限是
$auth[option_ss__task_jji__act_ii]=1;这个会不会有安全问题?明摆着让人知道了。
每个权限的值必须是“2”的整数倍吧?
如果要设置20个权限,该值立马攀升到5242882^30也不过10位数而已,不怕的。有时候具体问题具体分析吧。
只是偶看到这种方法比较好呀。共享出来和大家讨论了。。哈哈。差点儿忘记了楼上共享出函数的同学,其实也都是比较简单的函数嘛。不错不错。。
php的数组实在是太棒了。
然后比较权限直接用个SESSION数组就可以了。bit方法就是不知道一个数值后,要知道全部权限分布,还得一个一个的检测,就一点麻烦些。。其它倒也好
define("AUTH_ADMINISTRATOR", 1);
define("AUTH_SHOW", 2);
define("AUTH_ADD", 4);
define("AUTH_DELETE", 8);// 如果用户的权限为6 那么该用户是否有删的权限呢? --> 判断如下:if (AUTH_DELETE & 6)
{
exit(true);
}
else
{
exit(false);
}
?>
对应着一个权限名称,一个权限id。id的值就是稚鹰这个里面的1、2、4、8
看IPB论坛的后台可以得到一些启发。
-----------------------set类型不是每种数据库都有的吧~
而且"幂运算"的效率并不低 个人觉得基至比用set类型快~~~~~~
因为都是与或运算`````
当时在论坛里也看过。用二进制控制用户登陆系统的权限例子。前段机子硬盘挂了。数据都掉了。 有谁知道能不能共享一下。
==============================我发的这个不算二进制吗?
如果用户有1,2,3,4,5权限,假设当前要进行3权限的操作,我只用判断3是否在1,2,3,4,5这个数组里就行了,用in_array(),所以也就没有必要用2的n次方来解决啊,这样不是还增加的运算,导致效率低,直接用数组就行了啊?大家探讨下
但是除了两数相与外还要进行2的n次方运算啊?这不需要时间吗?还有我的是50个权限,如果用数组来解决是不是最佳方法呢?