数据权限设计(原创)
數據權限是針對數據表中行級和列級的控制,相對操作權限,顆粒度更細,復雜度更高,因為在項目中也有相關需求,是直接通過硬編碼sql查詢條件控制的,
后期維護起來比較困難。所以有了一些想法,后期也將在本人springBoot框架中實現。下面細說下我的一些想法:
一、行級權限(數據范圍)
1、應用場景:部門查詢范圍、區域查詢范圍、只能查看本人訂單等
2、實現方式:一般只能通過where條件去控制,但通過硬編碼方式,靈活度和維護度不高,建議通過按角色增加數據權限,達到和功能權限統一
3、具體實現(操作建議開發人員或DB人員維護)
建一個行級權限范圍控制表 userId(用戶id)、sql_id(mapper方法名)、type(控制類型:1-本部門 2-包含下級部門 3-本用戶)、isUsed(是否使用)、otherWhere(其他條件語句可添加其他字段的范圍)
功能實現:在用戶頁面添加按鈕數據權限,雙選項卡(行級數據、列級數據)、行級數據錄入上述表中的字段
本人用的mybatis,使用攔截器攔截到sql,首先判斷行級權限是否啟用,判斷sqlId是否匹配。判斷類型,本部門則查詢登陸用戶所屬部門,
包含下級部門則需要使用遞歸,本用戶則查詢當前登陸用戶的(這里建議設計所有表都有這個字段create_user,這樣才能按部門或用戶控制表數據)
如果otherWhere不為空,則繼續追加這個查詢條件
二、列級權限
1、應用場景:價格字段、身份證號、密碼等敏感字段
2、實現方式:頁面循環列控制顯示,比如jqgrid、datatables等,都是循環cols,在循環時通過標簽控制,標簽判斷如果為true,則顯示該標簽包含內容,反之,不顯示
3、功能實現:
同樣,先建一個列級權限范圍控制表userId(用戶id)、table_id(頁面tableId),type(控制類型:1-本部門 2-包含下級部門 3-本用戶)、isUsed(是否使用),hideCols(配置隱藏的列,和dataTables的columns字段相同,可用逗號分割)
在用戶數據權限的“列級數據”選項卡,先選定按部門、含下級部門、用戶,錄入多個隱藏的列用逗號分隔,注意id不能隱藏,保存
頁面表格列控制,本人這里使用的是shiro權限框架,前端用的thymeleaf+datatablse, 所以用直接用shiro自定義標簽(其它可用自定義標簽實現),標簽功能傳參table_id,col_id,根據登陸用戶id、table_id、col_id,isUsed=1查詢 count>0返回false,col不顯示
補充:上述建的行級控制和列級控制兩張配置表可放到redis緩存中,提高查詢性能
通過這種方式,可先只做功能權限,不考慮數據權限,如果有客戶需求,可通過需求進行配置開發,這樣改動的代碼量相對較小,而且通過攔截器實現的,不影響整個后臺的邏輯代碼,而且便于后期的統一維護和更改
這里只是目前本人的實現思路,如大家有更好的實現方式,可分享,跟大家一起進步~~~
轉載于:https://www.cnblogs.com/bao666/p/9035076.html
總結
以上是生活随笔為你收集整理的数据权限设计(原创)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到别人怎么告诉他
- 下一篇: 梦到和同学打架是什么意思周公解梦