服務端指南 | 基於角色的訪問控制

樑桂釗發表於2017-12-25

原文地址:服務端指南 | 基於角色的訪問控制 部落格地址:blog.720ui.com/

基於角色的訪問控制,英文是 Role-Based Access Control,簡稱 RBAC。它通過建立使用者與角色的對應關係,使得每個使用者可以擁有多個角色,每個角色可以擁有多個許可權。基於角色的訪問控制會定義多個不同的角色,不同角色實際上就是一個許可權的集合。基於角色的訪問控制中,不同角色之間具有高低之分,高許可權角色可以訪問低許可權角色的資源,但是低許可權角色往往不能訪問高許可權角色的資源。舉個例子,一個教育性質的作業系統中存在老師角色與學生角色,老師角色與學生角色都具有檢視作業的許可權,但是學生角色不具有審批作業的許可權,只有老師角色才具有審批作業的許可權,如果學生角色可以進行這個操作,那麼可能存在越權訪問。同時,基於角色的訪問控制遵守最小特權,應該授予所需要的完成其任務的最小角色,這樣可以防止使用者幹壞事。

RBAC 是一種“使用者-角色-許可權”的授權模型,主要分為 RBAC0 基本模型、RBAC1 角色的分層模型、RBAC2 約束模型、RBAC3 統一模型。其中,RBAC0 是 RBAC 的核心,包括使用者、角色、許可權和會話。RBAC1 基於 RBAC0 進行擴充套件,是 RBAC 的角色分層模型,引入角色繼承概念。RBAC2 基於 RBAC0 進行擴充套件,引入互斥角色的限制,互斥角色是指各自許可權互相制約的兩個角色,此外,還約束一個使用者擁有的角色是有限的,一個角色擁有的許可權是有限的,以及想要獲取較高許可權,首先需要擁有一個低階許可權。RBAC3 基於 RBAC0 的基礎上,將 RBAC1 和 RBAC2 進行整合,因此 RBAC3 是一種既有角色分層又有約束的一種模型。

本文主要基於 RBAC0 基本模型進行介紹“使用者-角色-許可權”的授權模型。基於角色的訪問控制通過建立使用者與角色的對應關係,使得每個使用者可以擁有多個角色,每個角色可以擁有多個許可權。

服務端指南 | 基於角色的訪問控制

其中,許可權限制了使用者所能進行的相關操作。舉個例子,一個教育性質的作業系統中存在老師角色與學生角色,學生角色具有檢視作業與寫作業的許可權,老師角色具有檢視作業與審批作業的許可權,因此具有學生角色的使用者是不能進行審批作業的操作。許可權可以作用於選單、API 介面、檔案等資源。

服務端指南 | 基於角色的訪問控制

在使用者量大的情況下,可以對使用者進行分組。此時,使用者組擁有一個角色,那麼使用者組內的所有使用者都將擁有這個角色。換句話說,引入使用者組的概念後,可以建立使用者組與角色的對應關係,那麼使用者組內的所有使用者都會間接地與角色發生關係。

在實際業務開發過程,Java 語言中的 Spring Security 與 Apache Shiro 都可以建立基於角色的訪問控制。這裡,演示了 Spring Security 的許可權攔截配置,其中設定不同角色對 URL 地址的訪問許可權。

@EnableWebMvcSecurity
public class ApiSecurityConfig {
    @Override
    protected void onConfigure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            // 匹配"/students/**"的所有 GET 操作,無需要任何身份認證
            .antMatchers(HttpMethod.GET, "/students/**").permitAll()
            // 匹配"/students/**"的所有 POST 操作,需要使用者擁有 teacher 角色
            .antMatchers(HttpMethod.POST, "/students/**").hasAuthority("teacher")
            // 匹配"/students/**"的所有(其他)操作,需要使用者擁有 admin 角色
            .antMatchers("/students/**").hasAnyAuthority("admin");
            // 其他的 URL 地址均需要加身份認證
            .antMatchers("/**").anonymous().anyRequest().authenticated();
    }
 
    @Override
    public void configure(WebSecurity web) throws Exception {
    }
}
複製程式碼

總結下,基於角色的訪問控制,通過建立使用者與角色的對應關係,使得每個使用者可以擁有多個角色,每個角色可以擁有多個許可權。使用者根據擁有的角色進行操作與資源訪問。

服務端指南 | 基於角色的訪問控制

(完)

更多精彩文章,盡在「服務端思維」微信公眾號!

服務端指南 | 基於角色的訪問控制

相關文章