1. 總體解決方案概述 html
權限設計主要有一下幾大部分組成:
PassPort:
針對如今系統的分析,系統之間有部分信息是共享的,這部分信息將由中心話的Passport來統一維護 mysql
權限訂閱模塊:
負責訂閱接受Passport發出的相關實體修改的信息。
資源權限綁定:
有效的將資源-角色-組-成員在數據庫中簡歷綁定。
數據權限高速內存數據緩存:
將數據權限相關的數據緩存在內存,提供高性能訪問能力。
Struts頁面權限過濾和綁定:
使用Struts的tag動態根據資源權限的設置,決定頁面中資源(按鈕,菜單,URL,頁面元素)的訪問能力。
數據權限過濾:
根據數據過濾權限的特定,定義的數據權限過濾的通用數據結構。
根據業務集成和整合的須要,和優先級別的須要,權限部分的開發設計將逐步推動,初期會以各應用系統爲單元進行資源權限和數據權限的改造,隨後將根據重要業務系統的須要,逐步創建中心話的passport。 算法
(1)功能級受權採用一般的權限分組,角色綁定資源的通用設計思路來完成。基本設計思路以下圖: 緩存
資源權限綁定概覽 安全
資源:
菜單,按鈕,URL,頁面中的任何元素。
角色:
根據業務定義的各類角色,好比訂單生成角色,結算角色等。
組:
用於聯繫角色和用戶。
用戶:
系統中登陸的用戶。 服務器
(2)資源權限在開發,測試,項目上線後維護中的不一樣做用:
項目開發和測試階段:
在項目上線以後和運維階段:
分組和角色分別都有兩種類型,一種是管理類型,一種是普通類型,如下作詳細說明:
分組表設計(Group)
列 |
類型 |
空 |
說明 |
Id |
Number(10) |
Not null |
PK |
Name |
Varchar2(128) |
Not null |
組名稱 |
Admin |
Boolean |
Not null |
是否爲管理類型 |
功能級受權的意義在於對頁面可見元素的操做性,單純從頁面的可見性可簡單劃分紅以下幾個部分:
以上三點其實均可以歸結爲第三點,即:任何頁面可見的元素都可歸入功能級權限管理。
實現方法:採用自寫JSP標籤完成,執行該標籤時須要從後臺或緩存中查找當前用戶是否有使用當前資源的權限,若是有則正常顯示,若是沒有則將標籤內全部內容從服務端剔除後再響應客戶端。以下圖:
資源權限流程
[java] view plain copy
頁面元素的可見性並不能控制URL的可訪問性,在系統設計中,使用Struts2的攔截器機制來過濾URL,防止用戶不經過頁面直接經過URL訪問系統。
系統資源的抽取設計。
系統資源包含了以上提到的兩個部分頁面元素和URL,兩種資源在某些時候是可組合的,好比按鈕點擊後提交URL,則該按鈕與該URL可組成一個資源。
頁面元素可獨立成爲一個資源,而URL不能脫離頁面元素獨立成爲資源。每一個資源都有惟一的標標識。
資源與資源之間也存在層級關係,好比下圖:
列名類型(長度) 能否空 |
說明 |
Key varchar2(256) not null |
標識資源的惟一的代碼 |
Name varchar2(256) not null |
資源名稱 |
Url varchar2(256) null |
對應的URL |
Parent_key varchar2(256) null |
父資源代碼 |
Desc varchar2(256) null |
描述或備註信息 |
Key值的設定建議採用會意的字符串,好比新增按鈕資源屬於第三級資源則它的代碼應該爲"sysres_duty_add".
對資源的受權採用ZTree插件實現,效果見下圖:
對資源進行管理的樹狀插件
[html] view plain copy
數據權限業務關鍵字定義
崗碼大致結構
崗碼的格式規則
崗碼格式以下:
崗位ID_崗位類型(管理/業務)_崗位職位_工貿ID_渠道ID_經營體ID_產品線code_BUCode_品牌_型號經營體.
注意:根據業務須要,崗碼會不斷的擴充,以存儲更多用於分析查詢的信息.
崗碼生成和崗碼從數據庫刷新至業務服務器
定時更新策略
天天定時執行崗碼更新SQL腳本,更新數據庫中的崗碼,而且定時重置內存中的數據緩存。這裏建議採用增量式更新,不然對數據庫壓力過大。這裏所使用的SQL腳本可參考下面第2點實時更新策略所使用的腳本。
實時更新策略
對於更新相對較頻繁的表(如人員表、崗位表),首先在該表上設立觸發器,基於表作的全部修改將記錄到歷史表中,系統定時掃描歷史表,發現改動則執行SQL腳本更新崗碼,並更新緩存。這裏的更新指單條記錄的更新,非批量更新。
當藍色部分使用應用服務的時候能夠直接更新緩存,從而略過橙色部分活動圖。
歷史表ecc_oms.sys.his
列名類型(長度) 能否空 |
說明 |
Id Number(12) not null PK |
PK |
Table_name varchar2(128) not null |
表名 |
PK_Valuevarchar(512) not null |
主鍵值如:123, 張三 |
PK_namevarchar(128) not null |
主鍵字段如:empId, empName |
Oper_type number(2) not null |
操做類型:增:一、刪:二、改:3 |
Create_time Date not null |
建立時間 |
flag varchar2(1) not null |
完成標記位: 0:未完成,1完成 |
(1) 新增用戶-崗位關係表和崗位-用戶崗碼關係表:ecc_oms.sys_emp_code
Emp_id :用戶ID
Code_id:崗碼ID-對應ecc_oms.ecc_oms.sys_code表主鍵
(2) 崗位-客戶崗碼關係表:ecc_oms.ecc_oms.sys_cust_code
Cust_code:客戶code
Code_id:崗碼ID
系統啓動時,將全部崗碼涉及到的表所有讀取成JavaBean(不是持久化對象),放在緩存中。
/**********資源相關**********/
人員信息: ecc_oms.sys_employee
組織(部門信息)信息: ecc_oms.sys_org
職位信息: ecc_oms.duty_title
區域(工貿)基本信息-ecc_oms.sys_area_info
所屬產品線,產品系統的產品(型號)信息:ecc_fnd.product_v
產品線信息:ecc_fnd.product_line_v
大小渠道基本信息-ecc_fst.sales_channel_properties
崗位基本信息:ecc_fst.station_config
客戶關係信息 -ecc_customer.customer_info_v
BU信息表 -ecc_oms.sys_bu_info
BU與產品線對應關係表 -ecc_fnd.bu_product_group_pl
/*********受權相關*********/
--組織經營體: ecc_oms.SYS_ORG_SALECHANN
--組織產品線: ecc_oms.sys_org_prod
--組織職位: ecc_oms.org_duty_title
崗碼錶: ecc_oms.sys_station_config
用戶崗碼錶: ecc_oms.sys_emp_code
客戶崗碼錶: ecc_oms.sys_cust_code
經營體與小渠道關係信息(按產品線): ecc_fst.sales_channel_manager_relation
客戶信息表-二級區域與客戶關係表
主要類列表和簡單描述:
類/接口名 |
簡介 |
核心接口描述 |
CacheServiceFacade |
暴露給客戶端遠程調用的接口 |
1.根據用戶id和崗位查詢該用戶的客戶列表,返回結果集自動關聯客戶對應的產品線信息 |
DefaultCacheServiceFacade |
CacheServiceFacade的默認實現類,根據請求的崗位類型自動判斷查找客戶信息 |
|
CacheService |
從緩存中讀取數據的頂層接口,定義內存中數據的讀取接口 |
1.根據用戶id查找用戶信息 |
AbstractCacheService |
CacheService的抽象實現,讀取客戶數據的公共方法抽取在裏面 |
|
CacheServiceA |
AbstractCacheService的子類實現,爲MD_XSJL下單 門店銷售經理查找客戶邏輯 |
|
CacheServiceB |
AbstractCacheService的子類實現,BU表明下單 |
|
CacheService |
AbstractCacheService的子類實現,查詢權限信息實現 |
|
CacheLoader |
緩存加載器 |
1.將指定表的數據加載到內存中 |
DefaultCacheLoader |
CacheLoader接口的實現類 |
|
TableOperation |
對單表進行的操做接口,用戶往操做歷史裏插入記錄時單條更新/刪除緩存操做 |
1.根據操做記錄對緩存進行操做 |
AbstractTableOperation |
TableOperation的抽象實現,定義公共操做方法 |
|
BasGCustomerInfoTableOperation |
AbstractTableOperation類的子類,表示 |
|
ReloadTableCacheJob |
定時任務,從新載入主數據表到緩存,每小時執行一次 |
|
UpdateCacheJob |
根據操做歷史記錄,對緩存中的數據進行單條更新,每15分鐘執行一次 |
|
UpdateCodeJob |
定時任務,按期掃描崗碼歷史表ecc_oms.sys_his,調用存儲過程,觸發更新崗碼操做,每10分鐘執行一次 |
|
在客戶端調用的應用中定義一個springbean,以下:
[html] view plain copy
Java代碼調用:
[html] view plain copy
將須要客戶端調用的接口方法添加在CacheServiceFacade類中,並編寫實現類。
客戶端調用根據實際狀況可進行調整,如下給出樣例
[html] view plain copy
[html] view plain copy