? ? ? 對(duì)于一個(gè)有N個(gè)管理模塊的WEB后臺(tái)程序,如何為管理員分配權(quán)限,又如何在表中體現(xiàn)出來,可能每個(gè)人都有自己的實(shí)現(xiàn)過程。我作為一個(gè)菜鳥,搜集了一些資料,在這里做一下整理。
? ? ?前題:五個(gè)模塊;兩個(gè)組;幾個(gè)用戶。權(quán)限分配。
? ? ?我記得我第一次做這個(gè)的時(shí)候,當(dāng)然網(wǎng)站比較簡單。一張表搞定,用USER_TYPE區(qū)分1234為不同的身份組(組的字典表都沒有做,程序中用注釋體現(xiàn)
),然后跟著五個(gè)字段,由0和1表示這個(gè)家伙有沒有管理權(quán)限。一切按著需求來,0和1的標(biāo)識(shí)對(duì)于一個(gè)小網(wǎng)站來說已經(jīng)夠用了,其實(shí)屬于一個(gè)假的權(quán)限指派,結(jié)果大家都想的到,因?yàn)閷?duì)于一個(gè)用戶來講他只有可見或不可見兩個(gè)層面,而不存在可管理不可管理的真實(shí)權(quán)限。當(dāng)然BOSS不知道,而我為了防止敲URL地址直接訪問,不得不在每個(gè)頁面都做驗(yàn)證。雖說騙過了BOSS,真正悲劇的在于以后模塊的越來越多,每加一個(gè)模塊我就得跟加一個(gè)字段,這應(yīng)該就是最讓人無法忍受的地方了。
? ? ?簡單歸簡單,簡單到無腦的設(shè)計(jì)。缺陷也很致命:
-
隨著功能的增加而增加表示權(quán)限的字段,DBA看見估計(jì)已經(jīng)哭的不成人樣了。
-
每個(gè)管理員對(duì)于增刪改查等操作根本無法做出細(xì)化的權(quán)限分配。
? ? ? 對(duì)于這個(gè)加字段的方法,我想可以用一個(gè)字段,里面存放JSON數(shù)據(jù)字符串而表示,這樣在存取的時(shí)候多一步解析,看起來“完美”的解決了這個(gè)隨著模塊的增加而加字段的問題。麻煩歸麻煩點(diǎn),總體還能正常工作。畢竟是權(quán)限要求細(xì)化程度不高的小站。而哪一天BOSS說給我把誰誰變成哪個(gè)組,要哪些管理權(quán)限,只能看,不能增加不能刪除。好吧,還好,涉及用戶不多,我在網(wǎng)頁上多做判斷好了,把增加和刪除不顯示出來。看起來我又挺過去了。
? ? ?但這總歸不是辦法,我明白了這個(gè)權(quán)限表設(shè)計(jì)的只能算是失敗的。
? ? ?怎么樣的設(shè)計(jì)才是完美的呢?
? ? ?回到需求上來,幾個(gè)模塊,幾個(gè)組,一批用戶。
? ? ?權(quán)限針對(duì)的管理對(duì)象是模塊,而一個(gè)模塊最少需要四種管理手段,即傳統(tǒng)的增刪改查。一個(gè)組擁有這個(gè)模塊的所有僅限,另一個(gè)組只擁有該模塊的查看瀏覽權(quán)限。如何設(shè)計(jì)?
? ? ?好在我找到了比較合適的方法。權(quán)限表的設(shè)計(jì)由模塊做為對(duì)象。
? ? ?組ID,模塊ID,ADD,MODI,DEL等幾個(gè)主要字段,0和1區(qū)分是否有管理權(quán)限。用戶只要指定組,就獲取了某一種管理權(quán)限。這樣的設(shè)計(jì)在后期增加模塊的情況下只需要為某個(gè)組增加幾個(gè)數(shù)據(jù)記錄而已,為組ID做個(gè)索引,還是有速度優(yōu)化空間的。而更大的好處就是權(quán)限被細(xì)化了。看起來很完美的解決方案。
? ? ?只是看起來。
? ? ?如果哪天為了增加個(gè)臨時(shí)體驗(yàn)帳號(hào)。如何是好?如果哪天組被刪除掉了,如何是好?
? ? ?我擦,組都沒了,我的用戶都沒權(quán)限了。
? ? ?失敗了?顯然是的。
? ? ?簡單的改動(dòng)一下,把組ID換成USER_ID,好了,組沒了就沒了吧。把組又細(xì)化到人身上,人對(duì)于模塊擁有哪些權(quán)限,有五個(gè)模塊就會(huì)出現(xiàn)關(guān)于這個(gè)USER_ID的五條記錄,一個(gè)矩陣。說回來,這個(gè)組怎么辦?
? ? ?組只是一個(gè)抽象的概念,如果在網(wǎng)頁上表示這么個(gè)矩陣:
? ? ?模塊一:checkbox, checkbox, checkbox
? ? ?模塊二:checkbox, checkbox, checkbox
? ? ?模塊三:checkbox, checkbox, checkbox
? ? ?模塊四:checkbox, checkbox, checkbox
? ? ?對(duì)于組的權(quán)限只是一個(gè)簡單的JS效果,把某些CHECKBOX搞成選中狀態(tài)就OK了。這樣可以做到非常人性化,每個(gè)模塊的權(quán)限可以加上兩個(gè)日期,起始日期,結(jié)束日期,臨時(shí)VIP就出來了,月會(huì)員制。
? ? ?勾選了組,自動(dòng)選中一些CHECKBOX,我再把CHECKBOX全點(diǎn)掉,這貨屬于管理員組,但沒有一點(diǎn)權(quán)限。誰說同一個(gè)組的人權(quán)限必須相同呢?
關(guān)于用戶組和權(quán)限的表結(jié)構(gòu)設(shè)計(jì)