天天看點

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

一 、簡介

      權限管理對有組織結構的系統重要性無需多言,沒有權限限制的管理、辦公系統将沒有可用性可談。說實話權限管理系統實作起來沒有任何門檻,直接幾個if else判斷就能解決現實需求 ,但是,如果需要靈活、健壯、可維護、可擴充達,使整個開發組滿意的的權限管理系統,那就另當别論了。

     那麼我們來看下權限實作的基本方式:代碼中固定權限代碼(A),對這段代碼名一個代号,然後在系統中建一個(權限/角色),最後把代碼(A)對應的代号關聯到(權限/角色),這樣把系統使用者關聯(權限/角色)就實作了系統權限的管理。也許你碰到過更為複雜的權限管理系統,但基本上都是這樣實作方式的變體或添加了不同權限限制次元。

在這個文章中,我們将介紹主流權限系統Apache Shiro及Spring Security的實作方式,并在第四節詳細介紹bg.work系統權限實作細節和他的獨到之處。

二、Apache Shiro

    Apache Shiro 不僅包含了權限管理(授權部分),也包含授權/加密/回話管理/驗證資料基礎接入等功能子產品,在這裡我們主要介紹權限管理功能子產品

 首先我們看下他的整體結構圖:

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

流程簡介:

  1. 業務代碼(最上層的各種語言實作)通過登入頁面登入系統
  2. 登入成功,Apache shiro根據配置配置設定給操作一個 subject執行個體,這個subject執行個體通過realms加載授權資料(連接配接授權/内部操作辨別)
  3. 操作者通路不同URL,受到subject加載的 授權連結比對限制
  4. 操作者删除或添加資料,則受到subject加載的内部操作辨別限制
  5. 通過這些操作限制組合就能有效管理操作者的行為
  6. 具體實作代碼就不在這裡COPY了

三、Spring Security

     Spring Security 是Spring 官方支援的權限管理功能,基本功能和Apache Shiro并無多少不同,實作的功能:認證,授權,甚至系統防護,首先我進也來一張實作構圖

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

流程簡介:

  1. 操作登入系統,初始化

    Authentication

    對象,通過UserDetailsService加載對應角色的權限與使用者資料填充

    Authentication的

    Principal 和grantedAuthorities
  2. 當通路一個需要權限的連結時,把連結需要的權限屬性和操作者的

    Authentication交給

    AccessDecisionManager決定是否有權通路
  3. 當CREATE或者DELETE一個資料對象時,把本次操作需要的權限屬性和操作者的

    Authentication交給AccessDecisiionManager判斷權限

  4. 整個過程和Apache Shiro功能相差無幾

四、bg.work 權限管理實作

   在簡要了解了Apache Shiro 和 Spring Secrity功能後,我們将詳細說明bg.work辦公架構的實作細節。bg.work的權限系統與本系統的資料與界面實作方式有着緊密的聯系,是以在介紹權限系統前,我們要先介紹下資料與界面功能。

     1、資料操作:

           bg.work在資料層設計了Model ORM,基本結構如下:

//model對應資料庫的表,基于model orm 實作,model字段可以動态讀取,利用這一原則與權限系統結合,可以動态設定針對model資料控制
@Model("department", "部門")
class Department:ContextModel("corp_department",
        "public") {
    companion object : RefSingleton<Department> {
        override lateinit var ref: Department
    }
    val id= ModelField(null,
            "id",
            FieldType.BIGINT,
            "标示",
            primaryKey = FieldPrimaryKey())
    val name= ModelField(null,
            "name",
            FieldType.STRING,
            "名稱")
    val comment = ModelField(null,
            "comment",
            FieldType.TEXT,
            "注釋")
}
           

      2、界面定義

<!--基于model orm 架構,界面元素對應Model屬性名稱,基于這一原則,我們可以結合權限控制系統實作對界面的靈活控制-->

<view type="list">
       <field name="id"/>
       <field name="name" type="static"/>
       <field name="comment" type="static"/>
</view>
           

對應界面:

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

 3、bg.work權限系統架構結構

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

說明:

Access Model Rule 控制Model(資料表)

read:是否有權操作、讀取字段設定、讀取哪個使用者資料、限制到什麼部門、限制到個人/整個組織、限制到目标角色、附加條件等

delete:是否有權操作、删除哪個使用者資料、限制到什麼部門、限制到個人/整個組織、限制到目标角色、附加條件等

edit:是否有權操作、更新字段設定、更新哪個使用者資料、限制到什麼部門、限制到個人/整個組織、限制到目标角色、附加條件等

create:是否有權操作、添加字段設定

設定界面:

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

  Model UI Rule 對Model View 的限制

 針對 model view 要展示的字段及操作按鈕限制,每種 model都有對應的View Type

設定界面如下:

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

App menu控制,也是針對管理系統的菜單進行控制:

OA/CRM/ERP 權限管理系統設計 - bg.work辦公開源實作

五、總結

 bg.work權限系統的加入,對後續功能的加入實作了直接控制,同時也實作了加入功能時不再考慮權限問題,所有的權限設定都推遲到系統部署或定制階段

附加:

bg.work 源碼連接配接:鼓勵請點贊

github:https://github.com/ouliuying/bgserver

gitee:https://gitee.com/ouliuying/bgserver

繼續閱讀