gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          設(shè)計(jì)及設(shè)計(jì)模式:關(guān)于Java權(quán)限控制算法

          向大家介紹一種很不錯(cuò),也是Linux中的權(quán)限管理算法。

            定義a^b為:a的b次方

            假如,我們?yōu)槊恳粋€(gè)操作設(shè)定一個(gè)唯一的整數(shù)值,比如:

            刪除A---0

            修改A---1

            添加A---2

            刪除B---3

            修改B---4

            添加B---5

            。。。

            理論上可以有N個(gè)操作,這取決于你用于儲(chǔ)存用戶權(quán)限值的數(shù)據(jù)類型了。

            這樣,如果用戶有權(quán)限:添加A---2;刪除B---3;修改B---4

            那用戶的權(quán)限值 purview =2^2+2^3+2^4=28,也就是2的權(quán)的和了

            化成二進(jìn)制可以表示為11100

            如果要驗(yàn)證用戶是否有刪除B的權(quán)限,就可以通過位與運(yùn)算來實(shí)現(xiàn)。

            在Java里,位與運(yùn)算運(yùn)算符號(hào)為&

            即是:int value = purview &((int)Math.pow(2,3));

            你會(huì)發(fā)現(xiàn),當(dāng)用戶有操作權(quán)限時(shí),運(yùn)算出來的結(jié)果都會(huì)等于這個(gè)操作需要的權(quán)限值!

            原理:

            位與運(yùn)算,顧名思義就是對(duì)位進(jìn)行與運(yùn)算:

            以上面的式子為例:purview & 2^3 也就是 28&8

            將它們化成二進(jìn)制有

            11100

            & 01000

            -------------------

            01000 == 8(十進(jìn)制) == 2^3

            同理,如果要驗(yàn)證是否有刪除A---0的權(quán)限

            可以用:purview &((int)Math.pow(2,0));

            即:

            11100

            & 00001

            ------------------------

            00000 == 0(十進(jìn)制)  != 2^0

            這種算法的一個(gè)優(yōu)點(diǎn)是速度快??梢酝瑫r(shí)處理N個(gè)權(quán)限,設(shè)置N種角色.

            如果想驗(yàn)證是否同時(shí)有刪除A---0和刪除B---3的權(quán)限

            可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;

            設(shè)置多角色用戶。根據(jù)權(quán)限值判斷用戶的角色。。。

            下面提供一個(gè)java的單操作權(quán)限判斷的代碼:

            //userPurview是用戶具有的總權(quán)限
          //optPurview是一個(gè)操作要求的權(quán)限為一個(gè)整數(shù)(沒有經(jīng)過權(quán)的!)

          public static boolean checkPower(int userPurview, int optPurview){
          int purviewValue = (int)Math.pow(2, optPurview);
          return (userPurview & purviewValue) == purviewValue;
          }

            當(dāng)然,多權(quán)限的驗(yàn)證只要擴(kuò)展一下就可以了。

            幾點(diǎn)注意事項(xiàng):首先,一個(gè)系統(tǒng)可能有很多的操作,因此,請(qǐng)建立數(shù)據(jù)字典,以便查閱,修改時(shí)使用。其次,如果用數(shù)據(jù)庫儲(chǔ)存用戶權(quán)限,請(qǐng)注意數(shù)值的 有效范圍。操作權(quán)限值請(qǐng)用唯一的整數(shù)!Java的int類型最多可以儲(chǔ)存11個(gè)權(quán)限和.如果超過,可以選擇其它數(shù)據(jù)類型,而且建議不同模塊,使用多個(gè)權(quán)限 變量.

          posted on 2008-03-09 20:32 gembin 閱讀(512) 評(píng)論(0)  編輯  收藏 所屬分類: JavaSE

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 黄石市| 长兴县| 怀化市| 汤原县| 辽源市| 澳门| 星子县| 温州市| 惠水县| 襄垣县| 永泰县| 大渡口区| 麦盖提县| 武川县| 商都县| 罗源县| 邹平县| 怀集县| 合阳县| 延长县| 佛冈县| 安陆市| 孝感市| 正镶白旗| 五台县| 通江县| 广丰县| 西贡区| 浦县| 岱山县| 米易县| 常山县| 贺兰县| 漳州市| 类乌齐县| 东港市| 广昌县| 莱芜市| 巫溪县| 永德县| 那曲县|