日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis整合数据权限

發布時間:2024/7/5 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis整合数据权限 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在很多企業級應用都需要攔截數據權限, 只有配置了相應數據權限的人才能看到該數據

關于數據權限的實現, 個人想了兩種實現方式

第一種是基于AOP, 配置相應的注解, 在切面中將數據權限的參數值強制設置到請求參數中去, 然后dao層利用mybatis的動態sql, 將權限值拼接進去, 該方案有前提條件, 數據權限控制的字段必須放到基類中, 其他的對象要繼承該基類, Mapper.xml必須抽取一個公用的, 其他的Mapper需要引用該mapper文件作為權限控制(否則每個類和Mapper.xml都要獨自維護一套, 不便于后續擴展和維護)

第二種是基于mybatis的攔截器, 攔截sql后將數據權限控制的sql拼接進去, 基于mybatis攔截器拼接sql的難點在于數據權限sql和原sql的拼接, 網上很多版本都是select * from (原sql) where 數據權限sql, 這種實際上并不可取, 一旦出現分頁, 或者最終查出的結果集不包含權限控制字段的話, 就會出現bug

這里使用的是正則表達式去匹配后拼接權限sql, 其他的可以參考網上mybatis攔截器的方案

/*** sql解析器** @author wang.js on 2019/5/8.* @version 1.0*/ public class SqlParser {private SqlParser() {}private static final String SQL_WHERE = "WHERE";private static final String SQL_LEFT_JOIN = "LEFT JOIN ";/*** 將數據權限的sql拼進原sql中** @param originSql 原sql* @param privilegeSql 數據權限sql* @return String*/public static String handlerSql(String originSql, String privilegeSql) {if (originSql.endsWith(";")) {originSql = originSql.substring(0, originSql.lastIndexOf(";"));}originSql = originSql.replace("\t", " ").replace("\n", " ");originSql = originSql.replaceAll(" {2,}", " ");originSql = originSql.replaceAll(" where ", " " + SQL_WHERE + " ");originSql = addWhere(originSql);originSql = originSql.replace("left", "LEFT");originSql = originSql.replace("join", "JOIN");originSql = originSql.replaceAll("LEFT[ ]+JOIN[ ]+", SQL_LEFT_JOIN);List<String> matcherList = matcherTableSql(originSql);for (String matcherSql : matcherList) {if (originSql.contains(SQL_LEFT_JOIN + matcherSql)) {continue;}String newMatcherSql = mergeSql(matcherSql, privilegeSql);originSql = originSql.replace(matcherSql, newMatcherSql);}return originSql;}/*** 添加where關鍵字** @param originSql 原始sql* @return String*/private static String addWhere(String originSql) {if (originSql.contains("WHERE")) {return originSql;}String[] split = originSql.split(" ");for (int i = 0; i < split.length; i++) {if (split[i].equalsIgnoreCase("GROUP") && (i + 1) < split.length && split[i + 1].equalsIgnoreCase("BY")) {return originSql.replaceAll(split[i], "WHERE 1=1 GROUP");}if (split[i].equalsIgnoreCase("ORDER") && (i + 1) < split.length && split[i + 1].equalsIgnoreCase("BY")) {return originSql.replaceAll(split[i], "WHERE 1=1 ORDER");}if (split[i].equalsIgnoreCase("LIMIT")) {return originSql.replaceAll(split[i], "WHERE 1=1 LIMIT");}}return originSql + " WHERE 1=1";}/*** 合并sql** @param originSql 原sql* @param privilegeSql 數據權限sql* @return String*/private static String mergeSql(String originSql, String privilegeSql) {return originSql.replace(SQL_WHERE, SQL_WHERE + " " + privilegeSql);}/*** 配置符合** @param originSql 原sql* @return List<String>*/private static List<String> matcherTableSql(String originSql) {List<String> matcharList = new ArrayList<>();String regex = "\\w[ ,](.*?)WHERE";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(originSql);while (matcher.find()) {matcharList.add(matcher.group());}return matcharList;}}

寫個測試類

@Test public void t1() {String privilegeSql = " brand_code in (1, 2, 3) and region_code in (2, 3) and";String originSql = "select * from (select t1, t2, t3 from tableA where 1=1) t1, (select t1, t2, t3 from tableB s where 1=1) t2";// String originSql = "select t1, t2, t3 from tableA";System.out.println(SqlParser.handlerSql(originSql, privilegeSql)); }

測試后輸出的結果為 select * from (select t1, t2, t3 from tableA WHERE brandcode in (1, 2, 3) and regioncode in (2, 3) and 1=1) t1, (select t1, t2, t3 from tableB s WHERE brandcode in (1, 2, 3) and regioncode in (2, 3) and 1=1) t2

這里需要強調的是, 必須保證每條需要權限控制的語句都含有where關鍵字, 否則數據權限sql拼接不進去

總結 第一種基于AOP的方案需要維護基類和Mapper的通用代碼, 其他的必須繼承或引用這兩個文件, 但是好處是不容易出現bug

第二種基于mybatis攔截器的方案需要保證每條需要權限控制的sql都有where關鍵字, 好處是mapper.xml和基類都沒有強制性要求

具體使用哪一種就看實際項目需要了

轉載于:https://www.cnblogs.com/shanzhai/p/10885401.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的mybatis整合数据权限的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。