<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    1+1=2,0+0=0

    日月累積
    posts - 7, comments - 50, trackbacks - 0, articles - 0
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    最近項目的項目很奇怪,一個大項目(系統)里包含了很多小的子系統,而這些子系統中都有權限控制的部分,這件事情挺讓我頭痛的,記得一年前在沈陽,我曾經有一段時間也因因這個問題而疲于奔命,為什么說疲于奔命呢?由于當時項目進度不允許,導致最終系統權限模塊草草了事,每個模塊都是由讀權限字符串來控制用戶ACL,當用戶無法訪問時,提示權限不夠。這么做對用戶是很不負責任的,既然讓用戶看到了操作的方式和界面,為什么又告訴用戶沒有權限呢?我開始懷疑我們是否應該在底層就封殺用戶的訪問權限。

    現在項目開展起來了,雖然目前我已經有了對權限控制的一套方案,并且實施成了我的可重用框架代碼,雖然目前的權限也是基于眾星捧月的AOP思想,但我至今對權限設計仍有兩個疑惑:

    疑惑一:很多同行提出方案,想要在底層就截取用戶權限,控制用戶對方法或者類的訪問。這樣做的好處在于可以將系統功能與業務邏輯松散耦合,并且實現簡單,結構清晰,三兩個advisor、filter,或者acegi就能搞定,但在web程序中體現出了他的劣勢,當我們將用戶的訪問拒絕在業務邏輯之外的時候,我們此時是否應該拋出異常提示用戶?一旦提示用戶沒有相應的權限,我認為對于用戶來說,這就不是一個perfect practice。由此得出,我們根本就不應該讓用戶做此次操作,而控制用戶操作的源頭就是界面,也就是說,在界面上我們就應該對用戶的權限元素(如添加按鈕、功能菜單等)進行控制。此時,一對矛盾出現了,要控制界面上形形色色的元素只有兩種辦法,一,將權限與你的界面結合起來設計,這將違背AOP的思想,也使得系統控制模塊的重用性大大下降,二,我們借鑒primeton的想法,將權限控制的理念抽取出來,單獨做成一套權限系統,解決你所有的需要權限控制的系統需求,這樣也有令人頭痛的問題,你的所有想用它來控制權限的系統,必須界面上統一風格。或許這樣的方式對商業web系統是合適的,畢竟需要你大刀闊斧個性化的地方不多,但我們卻很難保證在未來幾年內商業web系統的風格不改變。再者,開發這么一個系統也不是一蹴而就的事,在這個問題上一直讓我困惑不已。


    疑惑二:大多應用的權限判定是基于權限字符串的,但存儲在數據庫中的權限字符串能夠判定的權限并不多,在我們這次項目中,我引用了基于二進制的8421權限判定法則,我深深的感覺到權限字符串的弱勢,這使我想起了中國古老一套數學理論-“盈不足術”,超遞增序列的魅力在我眼前滑過,

    首先我來解釋一下盈余不足理論:有十只盒子,第一個盒子里放一個盤子,第二個盒子里放兩只,第三個盒子里放四只,第四個盒子里放八只……第九個盒子里放256只,第十個盒子放512只,即第N只箱子里放2^(N-1)只盤子,一共1023只。那么命題如下:在1023這個數字之內,任何一個數目都可以由這十只盒子里的幾只組合相加而成。那么1、2、4、8、16、32、64、128、256、512這個序列為什么有這么個魔力?這個數列的特點:1、每項是后一項的二倍,2、每項都比前面所有項的和大,而且大1。這個1就是關鍵,就因為這個1,它才可以按1遞增,拼出總和之內任意一個整數。這個序列叫做超遞增序列,它是解決背包問題的基礎。3、拼出總和之內任意一個整數可以由這個序列中的一些數構成,且構成方法唯一,據說是密碼學中的NP定理。譬如說這個數列總合中20這個數,只能由16+4一種方法構成,由此延伸出來,如果綜合中這個數據代表一個權值,我們可以解出它的所有構成參數(操作),如20這個數據,我們可以挨個和序列中每一項按位與,得出來如果不等于0,就說明他是由這個數構成的。

    保存權值到int還是varchar對于我們來說是個問題,當然,保存字符串的好處是運算壓力小。我們可能聽過一個故事,就是把這個超遞增序列延伸到第64項,就是那個術士和皇帝在國際象棋棋盤上要米粒的傳說。64項的和是一個天文數字!但計算機本身就是一個只認識二進制的機器!很多程序員整天只關心架構,甚至不知道或者不關心位操作是什么玩意,當然我們有朋友擔心數據庫的int不夠長,那么既然可以保存一個只有0、1組成的varchar字符串,為什么不能保存一個十六進制的字符串,有人規定varchar只能保存01嗎?十六進制串的長度正好是二進制的四分之一。

    由此我們可以無限制的擴展權值操作。

    在最近的項目里,我對權限的控制分成兩個部分,第一就是用戶體驗上,我設置了一個權限標簽,從數據庫中抽取權限信息,然后做到標簽里,也湊或算成是界面AOP了,第二就是底層的攔截,用了Spring 的AOP,為的是防止權限沖突,雙管齊下。暫時解決權限所需,另外在算法上我用了16進制的權限判別代碼,雖然配置較麻煩,寫完代碼還要寫文檔說明,不過也解決了權限繁雜又多的問題,暫時就這樣了,嘿嘿,以后有空再研究。


    評論

    # re: web開發中的權限設計拙見一二  回復  更多評論   

    2007-01-02 13:39 by ant
    如能結合些代碼談談,更佳。好文,關注!

    # re: web開發中的權限設計拙見一二  回復  更多評論   

    2007-01-02 14:29 by BeanSoft
    贊一個!

    # re: web開發中的權限設計拙見一二  回復  更多評論   

    2007-01-02 14:31 by 綠色使者
    其實上面用二進制一下子就解釋清楚了,1,2,4,8就是二進制的基,每一個十進制數當然可以用唯一的這些二進制基表示出來啦

    # re: web開發中的權限設計拙見一二  回復  更多評論   

    2007-01-02 21:55 by jerson[匿名]
    字也太小了吧

    # re: web開發中的權限設計拙見一二  回復  更多評論   

    2007-01-02 22:22 by 海思
    是否可以把16進制的權限判別代碼的相關代碼和文檔發份給我看看呢?
    我最近也在研究權限部分,由于對這塊不熟,比較頭痛,謝謝
    如果可以的話麻煩發份到我郵箱
    chmk35@163.com
    謝謝

    # re: web開發中的權限設計拙見一二(1)  回復  更多評論   

    2007-01-02 22:44 by 江上一葉舟
    首先對大家的關注表示感謝^_^
    另外由于我不會在評論信息中加載代碼,所以我將本文中的標題后面加上了(1),我將在我隨后的幾篇隨筆中分別談一下我的權限分配的相關數據庫設計、數據庫與權限關聯配置、界面權限控制和底層攔截機制,小文確是拋磚引玉,謝謝關注~~:)

    # re: web開發中的權限設計拙見一二(1)  回復  更多評論   

    2007-01-02 23:04 by errorfun[匿名]
    嗯,不錯,和我做的第一個項目時的想法一樣,權限系統也用了這個8421的方式實現,沒有權限的人就看不到菜單,看不到操作。這樣處理也是我覺得比較方便的做法了。不過后來是用了四個字段分別表示增刪改查這四個方法,1表示有權限,0表示沒權限。
    當時也是想了很多方案后才決定了,因為對于數據操作不外四種方式:查看,增加,修改,刪除。查詢,分析,報表之類的都可歸入查看之中。我是用數據庫保存權限的,因為覺得但用戶很多權限也很多時,數據庫的讀取比XML快上許多。只是在第一次讀取相關操作時,加載所需的權限的數據,加載完后以后訪問就不用再加載。而XML保存一般都在登錄時加載了所有權限,但XML在大量數據時讀取速度確實不感冒。

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-02 23:46 by 江上一葉舟
    呵呵,我目前所用到的權限種類繁多,所以權值也很多,權值基本的計算公式我就用了2的n-1次方,這樣權值可以無限擴展,無論是增、刪、改、查、報表、上傳、下載,我都會分配一個權值,如果一個角色擁有多個權限,則這個角色的權值為他所擁有的所有權限的權值的和,我將權值的和以16進制的形式記錄到庫中,基本上來說一個用戶對一個資源在數據庫中只有一條權限記錄

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-02 23:51 by 江上一葉舟
    另外對于權限的記錄來說,用數據還是xml文件來記錄我認為主要不在讀取速度上來區分,因為大多角色權限信息我會放入內存中,所以xml還是數據庫來記載對我來說無所謂,但有一點區別是致命的,就是當你修改權限信息時,你需要修改相應的紀錄,很明顯修改數據庫記錄要比修改xml文件來的方便,io操作還是挺讓人~~~嘿嘿

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 12:08 by errorfun
    怎么說呢,其實在以前我也考慮過你這個無限擴展的問題,但仔細一想,權限不存在無限擴展,權限基本的都是增刪改查,因為它們都是對數據庫的操作,
    比如你說的上傳功能,它只不過是對上傳的內容進行增加操作,再如下載,也不過就是對上傳內容的查看操作,你有查看權限了,自然有下載功能,有增加權限了,自然有上傳功能。
    再如報表,你不過是對報表這些內容的查看權限,所以不存在擴展性問題。
    不要被擴展性所迷惑,我開始設計權限時也一度被8421的可擴展性所迷惑,但最后想仔細,其實也就只有四個操作而已,放成四個字段,比8421的方式容易修改,也容易知道有哪些權限,不用再進行計算。就像你說你用16進制存權限吧,如果我1表示查看,2表示增加,4表示修改,8表示刪除,那如果我進行增加操作,那你就得判斷我的權值是否是2,3,6,7,10,11,14,15,這其實是增加的復雜性,權限系統本身就很復雜了,如果在權值上面還進行人為的復雜化,而僅僅為的是不存在的擴展性,那我覺得是得不嘗失的。
    如果是在小數據量時,XML文件方式不是不錯的,可惜權限本身就是大數據量的,針對這個問題其實我也想過一個解決方案:把每個人的權限放到一個XML文件中,因為針對個人的權限來說,相對還不算太大,然后用一個主XML存放相關文件的信息,而每個信息對應的就是這個人員的KEY,能唯一查找到對應的XML。這在某程度上應該可以解決XML加載的速度問題,但覺得不安全,因為XML文件很難對其讀寫進行權限控制,被人不小心刪除了或修改了,那也是一件麻煩的事,所以最終也沒用XML文件實現。

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 12:23 by errorfun
    PS:上面說的對權值的判斷,可以對16進制進行toBinaryString()進行判斷第N位是否為1,但如果在權限設置頁面時,用STRUTS標簽是很難進行這樣的判斷,一種方式是在頁面用嵌套JAVA的方式進行處理判斷,另一種方式是在數據讀取后,在返回前進行遍歷處理。第一種不用多說,現在還在頁面嵌套JAVA的做法已經被人拋棄了,原因就不多說。第二種自然只是在效率上有所減少而已。取舍還是看你自己了

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 13:10 by 江上一葉舟
    1,樓上的或許還是沒有看懂我所說的權限設計,倘若你的‘增加權限’設置為1,而a這個角色當前所擁有的權值是30,那么只需要1&30進行二進制運算,不等于0,則說明有增加權限,沒有你說的那么復雜。

    2,另外你所說的在頁面嵌入java代碼我不知是從何判斷,我是做好了一個現成的權限標簽,包在你需要判斷的頁面元素之外,如你可以在頁面上這么寫:
    <privilege scope='session' operation='create' beanName='userinfo'>
    <input type="button" value="添加">
    </privilege>
    這樣系統會自動為你判斷當前用戶是否具有添加權限,從而為你設置頁面上是否顯示添加按鈕

    3,權限是人定的,我可以把對這個資源的增加定為一種權限,上傳定位一種權限,客戶可能要求此人只能上傳不能增加(我說的上傳是指以excel文檔的形式上傳上來,解析其中的數據并添加入數據庫中),都是有可能的,可能你還是認為他們都屬于添加操作,但用戶就是要求你不能添加,只能上傳,只有它指定的人才能添加。另外我說的報表,不僅僅是察看,我們可以定義一種形式的pdf報表,將數據庫中的數據導出到pdf,并形成餅圖、曲線圖等,這和查看可以說完全是兩種不同的操作,所以權限是沒有限制的,也就是說實際系統中對一個資源的權限可能最多也就10種撐死了,但我們需要做到的是:無論對這個資源的權限如何擴展,我們都可以應對,不是么

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 15:46 by errorfun
    1、確實沒想過這么處理,今天算是學到了。
    2、是一個好辦法。
    3、如果是上傳EXCEL的話,可以看成是對文件的添加操作,解析數據可以看成是對數據的添加操作,都是一樣的,文件也不過是數據存儲的一種方式,數據庫未出現之前,數據就是以文件的形式保存的,難道數據庫出現后,對文件的上傳而不保存到數據庫中就不能算是添加操作了?不要跟我說你只是讓他上傳,但上傳后是不保存在服務器或數據庫或其它的任何地方,而僅僅是能點上傳按鈕而已。
    而報表形成餅圖也是一種權限的話,可以把它設置成對餅圖的查看操作,對曲線圖的查看操作,導出到PDF,也不過就是對PDF的查看操作,不過,個人認為,即然你都可以看到源數據了,餅圖,曲線圖卻不讓人看,還讓人家自己去畫不成?

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 16:53 by 江上一葉舟
    @errorfun
    1,呵呵,上傳文件僅僅是添加操作,我們只是獲得request流,解析流中數據,并且添加入數據庫,如果您硬要認為這個操作就是添加數據,我覺得也不無道理,但客戶的需求是這樣的:高級系統管理員角色可以一次性用excel導入一大批數據,普通的管理員不能進行這樣的導入操作,只能逐條添加,于是乎,您認為的這兩種“添加”操作在我們的系統中被看成是不同的兩種權限。

    2,您提到“即然你都可以看到源數據了,餅圖,曲線圖卻不讓人看,還讓人家自己去畫不成?”,您的這個想法無可厚非,但目前的需求是這樣的:普通管理員只能看到數據,即查看源數據,而領導要求只對他開放數據匯總成圖形的功能,也就是數據統計后的圖形查看功能,領導不關心源數據,只關系數據的統計結果和比例

    3,我覺得您的理解固然沒錯,但不同的客戶的需求不同,您所說的內容是針對需求的理解問題:)

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 17:30 by 壞男孩

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 19:37 by errorfun
    @江上一葉舟
    1、對于所說的情況確實是存在,如果是我,我會將領導的那種一次性導入看成是另一個資源操作,而權限是對這個資源操作的設置,對普通管理員,則沒有這個資源操作的權限,就像一個頁有增加,刪除,修改,查看,導入,上傳,下載的功能一樣,增刪改查,我會看成是一個ACTION中的操作,導入看成是另一個ACTION中的操作,上傳下載看成是第三個ACTION的操作。一個頁面分離成三個ACTION的權限設置,就是這樣而已,不是說硬要認為。數據的讀取方法,過程,可以不必特別在意,抽象出來后都一樣。“獲得request流,解析流中數據,并且添加入數據庫”不過就是獲得數據,保存數據的過程,和頁面填寫數據,然后提交保存入數據庫是相似的,不同的只是過程。

    2、我說的問題之前也說了它的權限設置可以看成是“對餅圖的查看操作,對曲線圖的查看操作,導出到PDF,也不過就是對PDF的查看操作”,所以對于領導的要求也是能完成的,普通管理員只有查看數據的權限,領導有查看餅圖的權限,查看曲線圖的權限。

    3、當然我說的也并非是針對某一需求的理解,而是將頁面的操作進行抽象后的理解所說的。呵呵

    權限有的是基于ACTION或URI,有的是基于資源的,可能你的是基于資源的,所以和我的想法并不是相同的。權限開得更清楚也不是沒有好處,至少在設置權限時用戶更加清楚它設置的權限對哪個操作有影響。
    就像我一開始說的,這是我第一個項目時所想的權限系統,當時所想的也是要簡化復雜的權限系統,而沒有關注到用戶設置權限時是否清楚的問題,時隔一年,現在的權限設已大不相同,操作的定義在于XML文件中,而非數據庫或用權值表示,操作可以有十個或一百個,這都不影響,設置權限時讀取的是XML文件中的信息,它顯示用戶可以設置哪些操作,操作對應的模塊等等的信息。而設置后的相應信息同樣保存進數據庫,在用戶登陸時再進行加載。數據庫保存的就是XML文件中的模塊或操作的ID,權限具有繼承的能力,系統權限優于模塊權限等等。這些都是根據市場和自己的理解變化而變化的。只是在看到你這篇文章后令我想起了自己設計的第一個權限系統而有感而發而已,不要見怪。

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2007-01-03 22:14 by 小賀
    好文章! 學習了!!

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2008-02-28 12:22 by black
    就是泛泛的說,又沒有一個簡單的例子,理論

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2009-03-26 23:40 by interdrp
    權限->策略->用戶 實例 www.interdrp.com 下載分銷系統客戶端,用系統提示的默認的帳套及用戶名進入系統即可。
    有什么好的想法也可以在 http://www.cnblogs.com/interdrp/ 提出,謝謝

    # re: web開發中的權限設計拙見一二(1)----設計思路  回復  更多評論   

    2011-08-10 10:58 by 1h
    rtyrt

    # re: web開發中的權限設計拙見一二(1)----設計思路[未登錄]  回復  更多評論   

    2011-08-10 11:00 by lh
    哥們! 可以將代碼和數據放在我郵箱嗎。謝謝
    76162111@qq.com
    主站蜘蛛池模板: 久久免费香蕉视频| 国产免费牲交视频免费播放| 久久国产免费观看精品3| 亚洲一区二区三区香蕉| 又长又大又粗又硬3p免费视频 | 国产成人精品亚洲| 在线a毛片免费视频观看| 中日韩亚洲人成无码网站| 在线观看日本免费a∨视频| 亚洲偷偷自拍高清| 女人被男人躁的女爽免费视频| 最新亚洲精品国偷自产在线| 天天摸天天操免费播放小视频 | 亚洲人成在线播放网站岛国| 7m凹凸精品分类大全免费| 亚洲国产视频网站| 国产成人A在线观看视频免费| 亚洲欧美日韩一区二区三区| 国产成人精品免费视频软件| 免费国产a理论片| 亚洲精品午夜国产VA久久成人| 国产成年无码久久久免费| 亚洲高清日韩精品第一区| 蜜桃视频在线观看免费网址入口| 亚洲国产午夜精品理论片在线播放 | 久久国产精品成人免费| 亚洲精品高清国产一久久| 99久久99久久精品免费看蜜桃| 亚洲日本中文字幕天天更新| 国产aa免费视频| 在线免费观看h片| 91亚洲性爱在线视频| 日本一区免费电影| 91国内免费在线视频| 亚洲AV无码乱码麻豆精品国产| 国产一区二区三区免费看| 精品国产免费一区二区三区香蕉 | 亚洲AV无码国产精品色午友在线| 免费阿v网站在线观看g| 特级做a爰片毛片免费看| 亚洲视频免费在线播放|