|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
会HTML吗?会,我能编好几个大表格排板的网页啦!设计|算法 权限设计
也许有这几种形式:
用户+组+脚色+权限
用户+组+权限
用户+脚色+权限
用户+权限
比来看了他人的设计办法,大多以“整数”来暗示权限值,如添加、阅读、删除和修正,分离用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,因而,我用正则处理了这个成绩,明天看来,这类办法仿佛过时了,由于不顺应面向对象的思惟和用框架系统来开辟体系!
以上是团体深刻的熟悉和描写,如有毛病,请列位斧正,但愿高人给些定见!
Posted by: trooman 2005-12-28 16:02
咋个这么冷僻,一个宣布点定见的都没有?
Posted by: axgle 2005-12-28 16:05
已保藏。
Posted by: Donyad 2005-12-28 16:41
1 2 3 的思惟是不异的,只是完成上的手段分歧罢了
而3后半局部楼主的例子,恕偶愚蠢,看不懂
3的做法是很C的,driver级别或体系级其余法式很经常使用
好比*nix下的文件权限0755 0777之类
办法1 跟 办法3 原型是如出一辙的,就是二进制位,办法3 是对这个的一个字符串摹拟
二进制 十进制
100 4
+ 1 1
------------
101 5
用互相自力的位来标记权限,就是为了原子性,素数一样具有这个特征
所以派生出2的做法,而分化质因数,我其实不以为这个会是一个成绩,由于三种办法都需求去反省所需求的权限
既然是反省,除一下所需求的质数便可
而3外面所说的要变长的成绩
1和2正好在概念上躲避了这个成绩
实践上,在C外面用二进制,有个对齐的成绩,就是要8位8位的请求,8位8位的用,无所谓太长了华侈
只是象办法3如许用字符串来摹拟二进制时会有华侈
而办法1 2在真正保留时,也是保留成一个int,也是一个请求过去就那末多位的二进制空间,无所谓华侈
扩大和弹性上,办法1和办法2是没有影响的
对办法3来讲是个成绩,那是由于办法3摹拟得欠好... 办法3感到有猪鼻子插葱之嫌
--------------
敲code多了,文字表达才能能够不可了,偶说不合错误的或说不清的中央接待人人拍砖,3q
Posted by: lihun21 2005-12-28 19:27
做个记号先
进修一下
如今还没有效到这么深的权限体系
我如今只要三种权限的用户,所以还没有思索那末多
超等办理员->通俗办理员->通俗用户
我想,我用的是这类形式
用户+权限
Posted by: wwcCSS 2005-12-28 20:06
楼主的文章不错。Donyad兄剖析的也很有程度。
Posted by: cozo 2005-12-28 20:10
这类器材只需一种办法就能够了。
我就只利用第一种。
Posted by: bitQ 2005-12-28 21:47
这个办法我有看到过~~~
用二进制暗示权限,不会相互影响,等候做个触及到这个的项目
高手就是高手~~`
Posted by: BinzyWu 2005-12-28 22:01
详细怎样标志权限 这个较无所谓
普通的体系
RBAC是已够用的.
普通Access Controller有3种
user based
group based
role based
RBAC有成熟的实际基本, 你可以搜刮以下, 能搜到良多论文.
但假如不是普通的使用体系, 那末权限体系能够设计需求较为出格. 这里只要广泛实际, 未必有广泛办法.
Posted by: terpomo 2005-12-29 00:31
进修了
Posted by: bleakwind 2005-12-29 01:14
我对照掉队,我是将每一个人的权限构成的数组序列化放入数据库。。。
每次载入页面初始化出来。。。
Posted by: nameless 2005-12-29 08:51
见过一个用办法3做的权限判别,操作很便利,也很天真
栏目权限用的直接把栏方针识用界定符分隔毗连,操作时判别有无这个标识,复杂,对栏目数过量且操作员过量的时分这个数据库效力应当不高(假如操作员能超越 10W 的话),呵呵
Posted by: trooman 2005-12-29 11:18
QUOTE (nameless @ 2005-12-29 08:51)
见过一个用办法3做的权限判别,操作很便利,也很天真
栏目权限用的直接把栏方针识用界定符分隔毗连,操作时判别有无这个标识,复杂,对栏目数过量且操作员过量的时分这个数据库效力应当不高(假如操作员能超越 10W 的话),呵呵
是的,我也以为办法3不会比二进制的效力差,在详细利用时可以用like,str_replace等,还可以摹拟二进制。
那种所谓的“栏目”权限办理,如今已过时了,但思惟仍是可以沿用的,如“对应栏目”改成“对应模块”,但完成体例已一模一样了!
Posted by: sean.zhuo 2005-12-29 13:51
哪位年老能o我v解一下"脚色"@概念幔坎欢谗峤薪巧.
Posted by: KnightE 2005-12-29 14:50
1和3,实质仍是一样的吧。
1有个优点,节俭空间。LZ提到开100个权限用来晋级。不外我碰到过一个超越100个权限种别的体系,并且用户树较多。所今后来压成了16进制存储(本来仍是一样),就相似1的处置办法了。
不外3最大的优点应当在于直不雅(其实假如权限项良多的话,也不直不雅了,呵呵)。
团体以为“权限贮存和判别的办法”其实还不是“权限设计”的重点和难点。咱们还需求思索其他器材。好比权限的设计布局(RBAC/GBAC/UBAC)的选择,好比权限在使用体系中的利用……
我GBAC(基于组的权限掌握)用的对照多。普通的逻辑是:
构成树型布局,用户跟组结点
判别权限,从组根目次入手下手往用户地点组停止遍历。肇端权限为“制止”
遍用时,子组权限掩盖肇端权限,直至用户。
最初用户权限掩盖肇端权限。失掉终究权限码。
固然貌似有些冗杂,不外较天真些。
其次谈谈权限的利用。凡是的做法(最少我是这么做的),即在“所需”时,依据以上逻辑判别某用户绝对某权限“是不是经由过程”,例如(乱写的,只是想暗示是在需求是停止判别):
CODE
// when someone posts a new topic
if ($access_controller->check($user, 'post'))
{
// access passed
$user->post($content);
}
else
{
// access denied
$sys->accessDenied();
}
而我一向很想测验考试的,是如许一种权限利用办法:即在$user实例出来时,已拆卸好他具有的权限(check once, run anywhere),例如:
CODE
class User
{
var $sid;
var $name;
var $passwd;
var $email;
// ...
function __call()
{
// it must be a ACCESS DENIED process here
die('no permission');
}
// maybe no other methods here...
}
// we need overload the User class in PHP4
// for the __call magic method
overload('User');
$user = new User();
// we need a AccessInject method to inject accesses into user object
$access_controller->access_inject($user)
// then, the user object includes its access methods...
// ok, we use the user's method directly
$user->post($content);
// if the user object includes the post method, it has the right permission...
随意写了点,没有很细心思索布局和定名,但愿能表达清晰我的意思。
抛砖引玉……
Posted by: LuciferStar 2005-12-29 17:40
做过一个表单,用法1和3保留多选的表双数据。
Posted by: james.liu 2006-01-05 17:10
假如是面向对象的,,偏向于小K的设法
用户上岸时,,假如用户名,暗码,甚么都对的,答应他上岸时,,实例化用户信息,包含权限
Posted by: gudai 2006-01-11 16:06
权限设计。头疼的成绩。
来历:http://club.phpe.net/index.php?act=Print&client=printer&f=2&t=11828
怎样学习,大家都知道编程是1门很枯燥的事业,所以大家一定要有兴趣,可能刚开始打算学的时候是因为别人说php有多好,php多么流行,但是后来伴随着学习的深入,你的这些 |
|