權(quán)限控制,,或者說(shuō)訪問(wèn)控制,廣泛應(yīng)用于各個(gè)系統(tǒng)中,。抽象地說(shuō),,是某個(gè)主體(subject)對(duì)某個(gè)客體(object)需要實(shí)施某種操作(operation),而系統(tǒng)對(duì)這種操作的限制就是權(quán)限控制,。 在網(wǎng)絡(luò)中,,為了保護(hù)網(wǎng)絡(luò)資源的安全,一般是通過(guò)路由設(shè)備或者防火墻建立基于IP和端口的訪問(wèn)控制,。 在操作系統(tǒng)中,,對(duì)文件的訪問(wèn)也要訪問(wèn)控制,。比如在Linux系統(tǒng)中,一個(gè)文件可以執(zhí)行的操作分為“讀”,、“寫”,、“執(zhí)行”三種,這三種操作網(wǎng)站交易同時(shí)對(duì)應(yīng)著三種主體:文件擁有者,、文件擁有者所在的用戶組,、其他用戶,主體,、客體,、操作這個(gè)三者之間的對(duì)應(yīng)關(guān)系,構(gòu)成了訪問(wèn)控制列表,。 在Web應(yīng)用中,,根據(jù)訪問(wèn)客體的不同,常見(jiàn)的訪問(wèn)控制可以通過(guò)解決以下幾個(gè)目標(biāo)問(wèn)題來(lái)實(shí)現(xiàn): 他是誰(shuí),? 他只能訪問(wèn)給他授予了權(quán)限的接口,! 他不能查看別人的數(shù)據(jù)! 下面我們以前后端分離的項(xiàng)目為例,,解釋如何解決這幾個(gè)目標(biāo)問(wèn)題: 他是誰(shuí),? 在前后端分離項(xiàng)目中,前端用戶登錄后后端服務(wù)會(huì)給其頒發(fā)一個(gè)token,,比如我們所熟知的JWT(JSON Web Token),,而后每次前端請(qǐng)求后端接口都會(huì)帶上這個(gè)token。由于JWT上會(huì)帶有用戶信息,,此時(shí)我們要做的就是校驗(yàn)這個(gè)token對(duì)應(yīng)的用戶是否為系統(tǒng)合法用戶,。 他只能訪問(wèn)給他授予了權(quán)限的接口! 光知道他是系統(tǒng)的合法用戶還是不夠,,web應(yīng)用還得保證當(dāng)前用戶只能訪問(wèn)他擁有權(quán)限的接口,。 比如有個(gè)薪資查詢的接口,業(yè)務(wù)上只允許部門領(lǐng)導(dǎo)角色訪問(wèn),。如果系統(tǒng)不做控制,,張三知道了薪資查詢接口,就拿著自己的token去調(diào)用此接口然后就能知道所有員工的薪資了,,這種問(wèn)題我們稱之為"越權(quán)訪問(wèn)"。 處理這個(gè)問(wèn)題現(xiàn)在應(yīng)用廣泛的一種方法就是“基于角色的訪問(wèn)控制(RBAC:Role-Based Access Control)”,,也稱“垂直權(quán)限管理”,。 RBAC事先會(huì)在系統(tǒng)中定義出不同的角色,不同的角色擁有不同的權(quán)限,,一個(gè)角色實(shí)際上就是一個(gè)權(quán)限的集合,。而系統(tǒng)的所有用戶都會(huì)被分配到不同的角色中,,一個(gè)用戶可能擁有多個(gè)角色。 當(dāng)用戶帶著token請(qǐng)求后端服務(wù)時(shí),,我們還得通過(guò)token查詢出當(dāng)前用戶所屬的角色,,然后根據(jù)角色查詢出用戶擁有的所有權(quán)限。權(quán)限框架 Spring Security 和 Shiro都很好的支持RBAC控制,。 他不能查看別人的數(shù)據(jù),! 張三和李四都是部門領(lǐng)導(dǎo),他們都可以查詢員工薪資的權(quán)限,。但是他們都只被允許查看自己部門員工的薪資,。張三知道了接口調(diào)用規(guī)則,就可以通過(guò)修改調(diào)用參數(shù)獲取李四部門員工的薪資了,,這種情況當(dāng)然也是不被允許的,。 在RBAC模型下,系統(tǒng)只會(huì)驗(yàn)證用戶A是否屬于角色RoleX,,而不會(huì)判斷用戶A是否能訪問(wèn)只屬于用戶B的數(shù)據(jù)DataB,,因此發(fā)生了越權(quán)訪問(wèn)。這種問(wèn)題我們稱之為“水平權(quán)限管理問(wèn)題”,。 現(xiàn)在數(shù)據(jù)級(jí)權(quán)限管理并沒(méi)有很通用的解決方案,,一般是具體問(wèn)題具體解決。 簡(jiǎn)單的做法是給接口請(qǐng)求加上秘鑰,,通過(guò)接口參數(shù)+當(dāng)前系統(tǒng)登錄人一起進(jìn)行加密發(fā)送給后端服務(wù),,后端接受到請(qǐng)求后對(duì)加密內(nèi)容進(jìn)行解密,根據(jù)約定的規(guī)則解析出用戶信息并與登錄用戶進(jìn)行匹配,,匹配上正常訪問(wèn),,匹配不上則拒絕訪問(wèn)。 |
|