天天看點

系統資料權限的實作方案

系統資料權限的實作方案

  目前正在開發的OA系統希望實作這樣一個需求:每個使用系統的使用者具有某種基于工号群組織架構的權限,主要區分為可以檢視個人、檢視本部門或指定部門以及檢視所有。這樣的權限控制稱之為資料範圍。

    對于資料範圍的實作主要通過以下方案:

1.配置資料依賴表,資料依賴表中有以下字段:主表的空間、主表、主表别稱、依賴表、依賴表别名

資料庫表定義如下;

T_sys_table_dependence

系統資料權限的實作方案

2.為mybatis.xml配置攔截器。Mybatis所謂的攔截器的一個作用就是可以攔截某些方法的調用,可以選擇在這些被攔截的方法執行前後加上某些邏輯,也可以在執行這些被攔截的方法時執行自己的邏輯而不再執行被攔截的方法。Mybatis攔截器設計的一個初衷就是為了供使用者在某些時候可以實作自己的邏輯而不必去動Mybatis固有的邏輯。比如在本方案中即可根據目前使用者的資料範圍動态的組裝成sql作為所有查詢sql的附加邏輯。Mybatis攔截器需要實作其接口Interceptor,其接口如下:

    通過該接口定義,可以看出實作一個mybatis攔截器最重要的是實作三述三個接口方法。Intercept方法定義攔截的時候需要實作的邏輯;plugin方法決定是否攔截以及傳回的目标對象;而setProperties則是将攔截器配置中的參數資訊映射進來。

  本方案中對該接口的實作如下:

  另外,mybatis攔截器還有兩個注解特别重要,一個是@Intercepts,其值是一個@Signature數組。@Intercepts用于表明目前的對象是一個Interceptor,而@Signature則表明要攔截的接口、方法以及對應的參數類型。本應用中配置如下:

  以上配置的含義是:當Executor代理對象在執行參數類型為MappedStatement、Object、RowBounds和ResultHandler的query方法時,攔截器就會進行攔截,而對其他的請求則直接傳回代理對象,而非目标對象。

3.通過配置Mybatis.xml注冊攔截器,配置如下:

  通過以上三個步驟,即實作了一個mybatis的攔截器。

4.下面将會對資料範圍實作的邏輯進行介紹,即本文第2段落的内容  

    通過mybatis攔截器為所有查詢請求添加并執行額外邏輯,較優雅地實作了DAO底層次的統一處理的封裝問題,很好地解決了系統對資料權限的要求。  

更多關于攔截器方面的知識,可以參考以下文章:

Mybatis攔截器介紹及分頁插件

MYBATIS 配置檔案(轉載)

繼續閱讀