原文地址:服務端指南 | 基於角色的訪問控制 博客地址:blog.720ui.com/web
基於角色的訪問控制,英文是 Role-Based Access Control,簡稱 RBAC。它經過創建用戶與角色的對應關係,使得每一個用戶能夠擁有多個角色,每一個角色能夠擁有多個權限。基於角色的訪問控制會定義多個不一樣的角色,不一樣角色實際上就是一個權限的集合。基於角色的訪問控制中,不一樣角色之間具備高低之分,高權限角色能夠訪問低權限角色的資源,可是低權限角色每每不能訪問高權限角色的資源。舉個例子,一個教育性質的做業系統中存在老師角色與學生角色,老師角色與學生角色都具備查看做業的權限,可是學生角色不具備審批做業的權限,只有老師角色才具備審批做業的權限,若是學生角色能夠進行這個操做,那麼可能存在越權訪問。同時,基於角色的訪問控制遵照最小特權,應該授予所須要的完成其任務的最小角色,這樣能夠防止用戶幹壞事。bash
RBAC 是一種「用戶-角色-權限」的受權模型,主要分爲 RBAC0 基本模型、RBAC1 角色的分層模型、RBAC2 約束模型、RBAC3 統一模型。其中,RBAC0 是 RBAC 的核心,包括用戶、角色、權限和會話。RBAC1 基於 RBAC0 進行擴展,是 RBAC 的角色分層模型,引入角色繼承概念。RBAC2 基於 RBAC0 進行擴展,引入互斥角色的限制,互斥角色是指各自權限互相制約的兩個角色,此外,還約束一個用戶擁有的角色是有限的,一個角色擁有的權限是有限的,以及想要獲取較高權限,首先須要擁有一個低級權限。RBAC3 基於 RBAC0 的基礎上,將 RBAC1 和 RBAC2 進行整合,所以 RBAC3 是一種既有角色分層又有約束的一種模型。微信
本文主要基於 RBAC0 基本模型進行介紹「用戶-角色-權限」的受權模型。基於角色的訪問控制經過創建用戶與角色的對應關係,使得每一個用戶能夠擁有多個角色,每一個角色能夠擁有多個權限。ide
其中,權限限制了用戶所能進行的相關操做。舉個例子,一個教育性質的做業系統中存在老師角色與學生角色,學生角色具備查看做業與寫做業的權限,老師角色具備查看做業與審批做業的權限,所以具備學生角色的用戶是不能進行審批做業的操做。權限能夠做用於菜單、API 接口、文件等資源。ui
在用戶量大的狀況下,能夠對用戶進行分組。此時,用戶組擁有一個角色,那麼用戶組內的全部用戶都將擁有這個角色。換句話說,引入用戶組的概念後,能夠創建用戶組與角色的對應關係,那麼用戶組內的全部用戶都會間接地與角色發生關係。spa
在實際業務開發過程,Java 語言中的 Spring Security 與 Apache Shiro 均可以創建基於角色的訪問控制。這裏,演示了 Spring Security 的權限攔截配置,其中設置不一樣角色對 URL 地址的訪問權限。code
@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 {
}
}
複製代碼
總結下,基於角色的訪問控制,經過創建用戶與角色的對應關係,使得每一個用戶能夠擁有多個角色,每一個角色能夠擁有多個權限。用戶根據擁有的角色進行操做與資源訪問。cdn
(完)blog
更多精彩文章,盡在「服務端思惟」微信公衆號! 繼承