用戶權(quán)限控制幾乎是每個網(wǎng)站都會涉及到的問題,這不僅是涉及到安全,而且還涉及到用戶的體驗,例如,某個用戶可能只需要用到少數(shù)幾個模塊,那么,我們就不應(yīng)該將無關(guān)的模塊顯示給他。對于很多的小型網(wǎng)站,可能只需要一個管理員賬號和密碼就可以了,但對于稍微大一點的網(wǎng)站,都會有一套比較嚴格的用戶權(quán)限管理機制。在實現(xiàn)方式方面,常見的有以下幾種(只是按經(jīng)驗劃分,不一定準確):
1、基于層級:將使用者分成多個層級,層級越高擁有的權(quán)限越大。例如在一個論壇系統(tǒng),可以分為超級管理員、普通管理員、版主等,上級會擁有下級的所有權(quán)限。
2、基于角色:如果系統(tǒng)的各個模塊所使用的用戶是相對固定的,那么使用這種方式是不錯的選擇。例如,一個超市管理軟件可以分為收銀員、開票員、倉管員等,然后分別有不同的應(yīng)用模塊,用戶之間的地位是平等的。
3、基于資源:按一定的粒度將各個模塊或操作定義為相應(yīng)的資源,然后再將資源授權(quán)給用戶使用。例如,可以將文章 的添加、刪除、修改、查看定義為資源,不同的人可以進行不同的操作。
4、基于流程:資源的使用環(huán)環(huán)相扣,通過前后環(huán)節(jié)的消息推送來實現(xiàn)控制。例如,在一個公文系統(tǒng),要發(fā)布一份公文,首先要有基層科員起草,然后推送給科長審批,再推送給辦公室校對,最后推送給局長簽發(fā),如果公文不在當(dāng)前用戶的環(huán)節(jié),即使是局長也無權(quán)修改。
基于角色和資源的用戶權(quán)限控制(用SpringMVC實現(xiàn))
通常,我們會混合使用上述的幾種方式。其中,基于角色和資源是目前較為常見的一種實現(xiàn),一般會有以下幾張表:
用戶表(users):id、用戶名、密碼、狀態(tài)(是否可用,下同)
角色表(roles):id、角色名、角色狀態(tài)
權(quán)限表(permissions):id、權(quán)限名、權(quán)限狀態(tài)
除了這三張表外,還要兩張表來將三者關(guān)聯(lián)起來:
用戶角色關(guān)聯(lián)表(users_roles):用戶id、角色id(復(fù)合主鍵)
角色權(quán)限關(guān)聯(lián)表(roles_permissions):角色id、權(quán)限id(復(fù)合主鍵)
然后,我們在相應(yīng)的action中通過annotation,或者在XML中定義相應(yīng)的permission即可。
如果你不想自己實現(xiàn),可以直接用Spring Security、Shiro等第三方安全框架,只要參照其規(guī)范建立幾張表,進行一下配置即可。如果要自己實現(xiàn)也不難,下面我們就通過過濾器來實現(xiàn)。
在Web環(huán)境中,“資源”大部分情況就是指用戶是否有權(quán)限訪問某個URL。為了實現(xiàn)更加靈活的配置,我們在上述提到的幾張表基礎(chǔ)上,再增加兩張表:
資源表(resources):id、URL、描述
權(quán)限資源關(guān)聯(lián)表(permissions_resources):權(quán)限id、資源id(復(fù)合主鍵)
相關(guān)數(shù)據(jù)表
(1)系統(tǒng)啟動的時候,建立一個Map (2)當(dāng)用戶登錄的時候,獲取該用戶所對應(yīng)的角色,再根據(jù)角色獲取其擁有的permission集合 (3)當(dāng)用戶訪問受限資源的時候,通過URL從resourceMap中獲取所需的permission集合,再跟該用戶擁有的permission集合比對,用戶有相應(yīng)的permission則通過,否則不通過。 實現(xiàn)代碼 (僅供參考,不一定完善) 1、啟動的時候建立resourceMap
2、用戶登錄的時候加載用戶的權(quán)限并放到Session
3、創(chuàng)建攔截器,對相關(guān)資源進行控制
4、Spring配置文件很簡單
如果你系統(tǒng)本身不復(fù)雜的話,其實也可以省掉resource表,直接使用URL作為permission,然后role跟permission對應(yīng)就可以了。這種實現(xiàn)方式的好處是可以對資源進行很精確的配置,除了上述方式,還可以采用粗粒度的配置(如將文章管理作為一項資源uc/articles,包括增刪改查),或者更加細粒度的配置(如針對URL的請求方法POST、GET、PUT、DELETE),不過也有一個問題,就是當(dāng)系統(tǒng)的資源很多的時候,在進行用戶權(quán)限比對的時候會有較大的消耗。這時候,可以考慮對資源和用戶進行分組,先進行分組匹配,再查找相關(guān)資源。