天天看點

權限系統設計

簡單地介紹一下業内權限系統的設計方案權限的分類對于權限的控制,一般包含以下兩個方面:         1.功能權限    

 簡單地介紹一下業内權限系統的設計方案

權限的分類

對于權限的控制,一般包含以下兩個方面:

        1.功能權限

        功能權限代表的就是一個使用者是否有進行這個操作的權限,比如你有銀行卡,你登陸了網上銀行之後,就有取款的功能權限

        2.資料權限

資料權限代表的是一個使用者是否有對某個資料操作的權限,還是上面的例子,你有銀行卡,而且有取款功能,但是你對自己的存款具有資料權限,你隻能看到自己的存款,隻能取自己的錢,對于别人的存款,你是不具有資料權限的

功能權限設計

對于功能權限,一般會設計出三個實體,分别是使用者、角色、權限

權限系統設計

一個權限代表着一個最小單元的操作,比如檢視存款,取款,轉賬

一個角色則是和一個或多個權限相關聯,比如銀行系統中的普通使用者是一個角色,普通使用者這個角色擁有檢視存款、取款、轉賬這些權限

一個使用者則是和一個或多個角色相關聯,比如某個使用者賬号既是一個普通使用者,又是一個系統的背景管理者,那麼他就同時擁有作為一個普通使用者的功能權限和作為一個系統管理者的功能權限

功能權限驗證

由于功能權限是對應着一個最小單元的操作,也就是對應着系統背景的一個方法,是以權限的驗證也應該是基于方法級别的。權限系統需要提供一個攔截器,負責攔截業務系統收到的所有請求,然後将以下三個資訊傳遞給權限系統:

        1.目前使用者的唯一辨別

        2.目前系統的唯一辨別(假設權限系統是同時管理多個系統的權限控制)

        3.目前請求需要操作的功能權限的唯一辨別

權限系統接收到這三個資訊之後,根據目前使用者的唯一辨別,擷取其對應系統下(這裡假設一個使用者在多個系統下也是可以登陸的,也就是多個系統共用一套使用者體系)的所有角色,然後根據這些角色擷取到這個使用者在這個系統下的所有功能權限的清單,最後再判斷目前請求的功能權限是否在這個使用者的權限清單之中,如果在,則表示該使用者具有這個功能權限,不在的話就表示目前使用者沒有這個權限

資料權限設計

對于功能權限,上述的方案基本上已經是一個比較統一的标準了,可是對于資料權限來說,業内還沒有一個非常完美的方案,因為資料權限的控制和系統本身的業務是緊密相連的,比如說銀行系統、圖書管理系統、sns網站,這些系統對資料權限的控制、要求肯定是不一樣的,而權限系統是獨立于業務系統之外的,權限系統本身不可能了解到業務系統的業務,也不應該去了解業務系統的業務,是以對于資料權限的控制,權限系統是無法提供一套完美的解決方案的,一般的做法是,權限系統提供一個資料權限控制的标準,然後所有的業務系統按照這個标準去實作自身資料權限控制的目标。

        一般來說,一條資料會有兩個歸屬:

        1.owner,表示建立這個資料的使用者,比如說我在論壇的遊戲頻道釋出一個文章,那麼我就是我這個文章的建立者,這個文章應該有一個ownerid的字段來辨別這個文章是我建立的,是以這個文章隻有我能夠修改

        2.organization,表示這個資料所屬的組織(注意,這裡的組織和平時我們說的組織的概念,有時候會不一樣),比如上面的例子,這個文章是在遊戲頻道釋出的,那麼這個文章就應該是屬于遊戲頻道這個組織

        基于以上兩點,我們可以對需要做資料權限驗證的資料添加 ownerid 和 organizationid 這兩個字段,并實作一個資料權限驗證的接口

        對于一個使用者來說,他自己本身的唯一辨別就可以看做是一個 ownerid,而使用者也是有所屬的,比如遊戲頻道的版主,他就是屬于遊戲頻道這個組織的

資料權限驗證

資料權限驗證是基于功能權限驗證的基礎上的,當判斷出目前使用者有用功能權限,需要進行資料權限控制的時候,會有兩種情況:

        1.目前使用者隻是進行查詢的操作,則業務系統會将目前使用者需要執行的sql傳給權限系統,權限系統會根據目前使用者的唯一辨別和他所屬的組織對sql進行一個加工——在sql的尾部添加 ownerid 和 organizationid 的判斷條件,使得目前使用者能查詢到的資料是他有權限看到的

        2.目前使用者在進行修改、删除操作時,則權限系統會根據目前使用者的 ownerid 和 organizationid 來判斷他是否有權限去進行操作

上述說到的例子裡面,其實還涉及到一個資料權限控制政策的問題,一般會有下面幾種情況:

        1.資料隻有所屬者可以進行操作,也就是隻有ownerid比對的時候,才能進行操作

        2.資料在統一個組織内是共享的,也就是當期那使用者的 organizationid 和資料所屬的 organizationid 比對,就能進行操作

        3.組織之間有樹型的層級關系,比如一個論壇分為遊戲頻道、小說頻道,那麼整個系統的管理者所屬的組織是整個論壇,遊戲頻道版主的組織是遊戲頻道,那麼系統管理者擁有其下屬組織對應的資料的所有權限

在現實的情況中,資料權限控制的政策可能還有更多的情況,我們可以針對不同的情況去做更進一步的抽象

總的來說,一個權限系統需要做的事情大概就是這些,主要争議的地方是在資料權限的控制方面,更多的時候,我們會讓各自的業務系統自己去完成資料權限的控制,而權限系統隻做功能權限的控制,畢竟實作上面的那套資料權限的标準,在某些場景下是得不償失的