免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123456
最近访问板块 发新帖
楼主: ljc_168
打印 上一主题 下一主题

大家进来讨论多用户权限的解决问题吧! [复制链接]

论坛徽章:
0
51 [报告]
发表于 2006-04-12 10:15 |只看该作者
原帖由 ipaddr 于 2006-4-12 09:28 发表
大的系统,除了权限的概念,还有一个角色的概念的,


对,oa系统至少也会有7个角色

论坛徽章:
0
52 [报告]
发表于 2006-04-12 10:17 |只看该作者
原帖由 ultralqxq 于 2006-4-11 17:02 发表

我也说过了。方法不止一种。
你这样子存法,那个powers会很大个吧?用text类型?
你的判断思路非常简单。。
1。取powers数组(是以数组存的吧?)
2。在powers数组中查找是否有3权限

在数组中查找是否有 ...

用varchar就行了,长度能有255
然后用in_array()即可判断
我又想到一个方法
username  powers
abc            1
abc            2
..............
abc           50
..................
u1            1
...


这样设计数据库,这样判断权限就更方便,效率应该也提升上来了,如果用户数较多,可以用hash算法来用分表策略

论坛徽章:
0
53 [报告]
发表于 2006-04-13 19:35 |只看该作者
原帖由 ultralqxq 于 2006-4-12 03:31 发表

我之前也没有很深入的去想过这个问题。。。到你提出来后我才发现。。
恩,对极。按照思维逻辑来说,用or 和 and来做会更符合我们的思维方式!!谢谢你的提醒!!


PS:呵,上面的话是我看到你的回帖后的惊 ...


我说的是位运算的 & 和 |,而不是 ^。
用单词是因为符号不容易看清楚。

一般来说没有任何必要用 ^。所以你前面不停说“异或”是不对的。

论坛徽章:
0
54 [报告]
发表于 2006-04-14 10:26 |只看该作者
我的权限系统正在使用,可以任意扩展,看看是否可供参考:

http://bbs.chinaunix.net/viewthr ... p;extra=&page=1

示范页面:

http://www.toptree.net/usergroup_admin.htm

[ 本帖最后由 qingmedia 于 2006-4-14 10:27 编辑 ]

论坛徽章:
0
55 [报告]
发表于 2006-04-14 15:18 |只看该作者
原帖由 ultralqxq 于 2006-4-8 08:37 发表
不要用乘法来做(乘法算是高级运算了),应该用加法或位运算!如
游览1\录入2\修改4\删除8等等。。反正是00000001 00000010 00000100 00001000这样的形式。。。
这样不需要任何比较或运算,所有权限一目了然!! ...


这个是很常用的做法,适用于模块数量较少的权限系统,大量用户的情况。
具体的是:给每个用户一个存储标志块(变量), 大小固定(假设为nbyte),这样我们就有8n位可以设置0,1来表示有无权限(对于某类需要多个权限类型的模块,例如某模块需要读,写,操作3个权限,我们给[权限数/2]+1位来表示就可以了)。设置和读取的时候都用位操作。
例如(0x101 ^ 0x001) 可以得到是否最后1位是1。(0x101 | 0x001)得到设置最后一位是1的结果。
         |               |
      用户变量    最后1位是1代表的权限

但是这个做法不适用于上面有兄弟提出的100种(甚至更多)模块权限,但是用户本身的权限很稀疏(就是指用户只有少量的几个模块的权限)的情况(我觉得这个是有可能的,而且适用的情况比较多)。这种情况比较常用的是每个用户的权限变量用类似的结构:
{
    {权限模块ID, 具体权限}
    {权限模块ID, 具体权限}
}
无权限就是找不到相应的ID,具体模块权限也可以查找得到。


这2种是最基本的权限数据上的设计,具体的设计还是依赖于实际的需求/应用。
脱离了需求的设计都是空想。

论坛徽章:
0
56 [报告]
发表于 2006-04-14 15:40 |只看该作者
原帖由 dz902 于 2006-4-13 19:35 发表


我说的是位运算的 & 和 |,而不是 ^。
用单词是因为符号不容易看清楚。

一般来说没有任何必要用 ^。所以你前面不停说“异或”是不对的。

呵,想用的话肯定能用到的啊!!比如想把用户已有的权限去掉。。那就是用异或啊!
$userpower = $userpower ^ DELETE;
不然就要写成:
$userpower = $userpower & (!DELETE);
//而这句按照你提议的思维(去掉权限用& ,添加权限用|)却正好会误解成“将除删除权限之外的其他权限全部去掉”!!

我只是举了个简单的例子。。事实上肯定会有更适合它的场合应用!!!不过我上面也承认了的。。
开始时我并没考虑的那么清楚~~按照思维逻辑是应该用& 和 | 的!
所以我把前面例子也改过来了~

[ 本帖最后由 ultralqxq 于 2006-4-14 15:45 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP