posts - 193,  comments - 520,  trackbacks - 0
          一個(gè)朋友留言,提了一些關(guān)心的問題,這里說說自己的想法(不一定對(duì))。
          問題:
          數(shù)據(jù)范圍的控制:“事實(shí)上不是每個(gè)用戶都可以看到所有記錄的。以財(cái)務(wù)管理為例,部門經(jīng)理只能查看金額小于1W的數(shù)據(jù);而總經(jīng)理則沒有限制”。象這樣要根據(jù)數(shù)據(jù)的某個(gè)字段對(duì)數(shù)據(jù)范圍進(jìn)行控制,應(yīng)該實(shí)現(xiàn)呢,是通過AOP動(dòng)態(tài)改變執(zhí)行的SQL嗎?這樣似乎不太可行,如果要執(zhí)行的SQL特別復(fù)雜,那動(dòng)態(tài)改變SQL 就更難了。現(xiàn)在的應(yīng)用中一般使用hibernate,這樣的話就變成了動(dòng)態(tài)改變HQL,也是難的。
          回答:目前在我的代碼里就是通過AOP動(dòng)態(tài)改變執(zhí)行的SQL,改變HQL確實(shí)很困難,但是改變criteria就比較簡(jiǎn)單了。對(duì)于特別復(fù)雜的sql,我的建議是把這些SQL直接寫到你的業(yè)務(wù)程序里去,或者單獨(dú)配置出來,和ibatis比較類似。

          問題:單條數(shù)據(jù)ACL權(quán)限:由于數(shù)據(jù)是不斷增加的,所以要對(duì)單條數(shù)據(jù)的ACL權(quán)限,不應(yīng)該是數(shù)據(jù)已存在,然后再對(duì)存在的數(shù)據(jù)授權(quán),應(yīng)該是對(duì)某種規(guī)則進(jìn)行授權(quán)。以你舉的個(gè)人通訊錄為例,各人自己維護(hù)自己的通訊記錄,數(shù)據(jù)只對(duì)自己可見,要想實(shí)現(xiàn)對(duì)自己的數(shù)據(jù)的可再授權(quán),應(yīng)該是對(duì)符合某個(gè)規(guī)則的數(shù)據(jù)進(jìn)行授權(quán),也就是說 “要執(zhí)行授權(quán)操作的人就是數(shù)據(jù)的擁有者”這是個(gè)規(guī)則,那是不是應(yīng)該對(duì)這個(gè)規(guī)則授權(quán)呢。
          回答:我理解的和你不一樣。我的理解是這樣的,實(shí)際中我把單條數(shù)據(jù)的權(quán)限劃分為擁有、瀏覽、修改、刪除四種權(quán)限,用戶擁有哪種權(quán)限就可以對(duì)數(shù)據(jù)進(jìn)行相應(yīng)哪種操作。“要執(zhí)行授權(quán)操作的人就是數(shù)據(jù)的擁有者”也可以理解為“要執(zhí)行授權(quán)操作的人就必須有該數(shù)據(jù)的擁有權(quán)限”,這可以理解為一種規(guī)則,但我更愿意把它理解為一種習(xí)慣,很顯然對(duì)習(xí)慣授權(quán)是沒有意義的。當(dāng)然這里是存在規(guī)則的,這種規(guī)則簡(jiǎn)單的說是這樣:當(dāng)我新增一條數(shù)據(jù)時(shí),哪些人對(duì)該條數(shù)據(jù)擁有擁有的權(quán)限,哪些人對(duì)該條數(shù)據(jù)擁有瀏覽的權(quán)限,哪些人對(duì)該條數(shù)據(jù)擁有修改的權(quán)限,哪些人對(duì)該條數(shù)據(jù)擁有刪除的權(quán)限。權(quán)限相關(guān)記錄會(huì)在新增這條數(shù)據(jù)時(shí)根據(jù)該規(guī)則生成。在上面的例子里,這一規(guī)則體現(xiàn)在:各人自己維護(hù)自己的通訊記錄,數(shù)據(jù)只對(duì)自己可見。也就是說在用戶新增自己的通訊記錄時(shí),系統(tǒng)同時(shí)往權(quán)限表里插入了該用戶對(duì)該記錄的一個(gè)擁有權(quán)限記錄。

          問題:數(shù)據(jù)字段權(quán)限:要實(shí)現(xiàn)對(duì)某個(gè)字段的權(quán)限控制,那是不是應(yīng)該所有字段應(yīng)該有個(gè)默認(rèn)的操作呢,或者默認(rèn)就是只可以查看,要進(jìn)行修改的話就必須授權(quán)。但是通常整個(gè)應(yīng)用中的字段非常多,這樣是乎不太合理。那是不是可以做成所有字段默認(rèn)就是可以CRUD的,只有要控制的字段才進(jìn)行權(quán)限判斷。同樣,由于使用 Hibernate來進(jìn)行持久化,那對(duì)字段的控制是不是就變成了對(duì)類中屬性的控制。
          回答:數(shù)據(jù)字段權(quán)限一直是一個(gè)很難辦的事情,實(shí)際上我很傾向于把這個(gè)問題推到頁(yè)面來解決。其實(shí)所有的權(quán)限控制最后都是要通過頁(yè)面來表現(xiàn)的。其實(shí)對(duì)字段來說,所需要的權(quán)限也很簡(jiǎn)單:可見/不可見,只讀/可修改。這樣的話,通過標(biāo)簽的形式來控制字段的顯示、只讀就顯得很自然。對(duì)字段的權(quán)限記錄可以放入到數(shù)據(jù)庫(kù),或者xml中,與具體的pojo類沒有關(guān)系,當(dāng)渲染頁(yè)面的時(shí)候,由標(biāo)簽來讀取相關(guān)權(quán)限記錄并控制顯示。

          問題:角色權(quán)限的繼承:角色權(quán)限的繼承通過規(guī)則來做,這個(gè)規(guī)則應(yīng)該怎么設(shè)計(jì)呢。
          回答:這個(gè)問題其實(shí)是一個(gè)分離關(guān)注點(diǎn)的問題。你可以抽象出一個(gè)規(guī)則接口,這個(gè)接口定義了對(duì)部門、角色下的用戶而言,哪些權(quán)限是可以從部門角色繼承的,繼承幾級(jí),哪些是不可以的。然后再具體實(shí)現(xiàn)。更靈活的方式是定義出一個(gè)配置文件,運(yùn)行時(shí)可以靈活修改。




          http://www.aygfsteel.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:)
          posted on 2007-06-05 17:36 ronghao 閱讀(4079) 評(píng)論(3)  編輯  收藏 所屬分類: 權(quán)限相關(guān)

          FeedBack:
          # re: 關(guān)于權(quán)限系統(tǒng)設(shè)計(jì)的一些問與答
          2008-03-18 00:25 | leekiang
          字段級(jí)別的權(quán)限控制,你用標(biāo)簽去讀取配置,可以做到頁(yè)面級(jí)別的控制,即客戶可見/不可見,只讀/可修改,但這個(gè)并不能容易的做到url級(jí)別控制,即防止客戶繞過頁(yè)面,模擬提交.
          期待你的回復(fù) 。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于權(quán)限系統(tǒng)設(shè)計(jì)的一些問與答
          2008-04-07 18:20 | ronghao
          @leekiang
          在其他文章里有交代,這些權(quán)限控制是結(jié)合使用的。  回復(fù)  更多評(píng)論
            
          # re: 關(guān)于權(quán)限系統(tǒng)設(shè)計(jì)的一些問與答[未登錄]
          2011-01-22 11:46 | 學(xué)習(xí)者
          博主作者、您好!本人希望向您學(xué)習(xí)一下權(quán)限有關(guān)的問題、加我的Q:343537050.  回復(fù)  更多評(píng)論
            
          <2007年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          關(guān)注工作流和企業(yè)業(yè)務(wù)流程改進(jìn)。現(xiàn)就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100

          常用鏈接

          留言簿(38)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          常去的網(wǎng)站

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 得荣县| 昭通市| 互助| 和硕县| 凤庆县| 江阴市| 平顶山市| 志丹县| 睢宁县| 鞍山市| 周宁县| 攀枝花市| 观塘区| 青冈县| 睢宁县| 沧州市| 临洮县| 敦煌市| 凤翔县| 石棉县| 广宁县| 淮安市| 吉隆县| 文成县| 黎川县| 班戈县| 广宁县| 密云县| 怀宁县| 阿坝县| 溧阳市| 华蓥市| 涿鹿县| 县级市| 怀安县| 徐州市| 苍山县| 洞口县| 禹州市| 尼玛县| 巴青县|