1. 程式人生 > >Web應用訪問控制

Web應用訪問控制

許可權控制,或者說訪問控制,廣泛應用於各個系統中。抽象地說,是某個主體(subject)對某個客體(object)需要實施某種操作(operation),而系統對這種操作的限制就是許可權控制。

在網路中,為了保護網路資源的安全,一般是通過路由裝置或者防火牆建立基於IP和埠的訪問控制。在作業系統中,對檔案的訪問也要訪問控制。比如在Linux系統中,一個檔案可以執行的操作分為“讀”、“寫”、“執行”三種,這三種操作同時對應著三種主體:檔案擁有者、檔案擁有者所在的使用者組、其他使用者,主體、客體、操作這個三者之間的對應關係,構成了訪問控制列表。

See the source image

在Web應用中,根據訪問客體的不同,常見的訪問控制可以分為“基於URL的訪問控制”、“基於方法(method)的訪問控制”和“基於資料的訪問控制”。

 

垂直許可權管理

訪問控制實際上是建立使用者與許可權之間的對應關係,現在應用廣泛的一種方法,就是“基於角色的訪問控制(RBAC:Role-Based Access Control)”,我們可以稱之為“垂直許可權管理”。

RBAC事先會在系統中定義出不同的角色,不同的角色擁有不同的許可權,一個角色實際上就是一個許可權的集合。而系統的所有使用者都會被分配到不同的角色中,一個使用者可能擁有多個角色,角色之間有高低之分(許可權高低)。在系統驗證許可權時,只需要驗證使用者所屬的角色,然後就可以根據該角色所擁有的許可權進行授權了。

Spring Security中的許可權管理就是RBAC模型的一個實現。Spring Security 提供了一系列的“Filter Chain”,每個安全檢查的功能都會插入在這個鏈條中。在與Web系統整合時,開發者只需要將所有使用者請求的URL都引入到Filter Chain即可。Spring Security提供兩種許可權管理方式,一種是“基於URL的訪問控制”,一種是“基於method的訪問控制”,這兩種訪問控制都是驗證使用者所屬的角色,以決定是否授權。

在配置許可權時,應當使用“最小許可權原則”,並使用“預設拒絕”的策略,只對有需要的主體單獨配置“允許”的策略,避免發生“越權訪問”。

 

水平許可權管理

在RBAC模型下,系統只會驗證使用者A是否屬於角色RoleX,而不會判斷使用者A是否能訪問只屬於使用者B的資料DataB,因此發生了越權訪問。這種問題我們稱之為“水平許可權管理問題”。

相對於垂直許可權管理來說,水平許可權問題出在同一個角色上。系統只驗證了能訪問資料的角色,既沒有對角色內的使用者做細分,也沒有對資料的子集做細分,因此缺乏一個使用者到資料之間的對應關係。由於水平許可權管理是系統缺乏一個數據級的訪問控制所造成的,因此水平許可權管理又可以稱之為“基於資料的訪問控制”。

現在資料級許可權管理並沒有很通用的解決方案,一般是具體問題具體解決。一個簡單的資料級訪問控制,可以考慮使用“使用者組”的概念,比如一個使用者組的資料只屬於該組內的成員,只有同一使用者組的成員才能實現對這些資料的操作。此外,還可以考慮實現一個規則引擎,將訪問控制的規則寫在配置檔案中,通過規則引擎對資料的訪問進行控制。