日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Springboot+mybatis-plus+注解實現數據權限隔離

瀏覽:87日期:2023-02-27 15:48:03
目錄1.創建注解2. 具體實現1.創建注解

當此注解打在類上,不需要傳參,該類下所有查詢接口開啟數據隔離;打在方法上默認開啟數據隔離,傳參為false則該方法關閉驗證

/** * 數據權限驗證注解 * @author xiaohua * @date 2021/6/23 */@Documented@Target({METHOD, ANNOTATION_TYPE, TYPE})@Retention(RUNTIME)public @interface DataPermission { /** * 是否要進行數據權限隔離 */ boolean isPermi() default true;}2. 具體實現

@Component@Intercepts({@Signature(type = StatementHandler.class, method = 'prepare', args = {Connection.class, Integer.class})})public class DataPermissionInterceptor implements Interceptor { private static final Logger logger = LoggerFactory.getLogger(DataPermissionInterceptor.class); @Autowired private TokenService tokenService; //掃描的包路徑(根據自己的項目路徑來),這里是取的配置里的包路徑 @Value('${permission.package-path}') private String packagePath; private final static String DEPT_ID = 'dept_id'; private final static String USER_ID = 'create_user'; private static List<String> classNames; @Override public Object intercept(Invocation invocation) throws Throwable {try { LoginInfo user = tokenService.getLoginInfo(); if (user == null){return invocation.proceed(); } List<Long> deptIds = (List<Long>) Convert.toList(user.getDataScope()); if (deptIds == null){deptIds = new ArrayList<>(); } //反射掃包會比較慢,這里做了個懶加載 if (classNames == null) {synchronized (LazyInit.class){ if (classNames == null){//掃描指定包路徑下所有包含指定注解的類Set<Class<?>> classSet = ClassUtil.scanPackageByAnnotation(packagePath, DataPermission.class);if (classSet == null && classSet.size() == 0){ classNames = new ArrayList<>();} else { //取得類全名 classNames = classSet.stream().map(Class::getName).collect(Collectors.toList());} }} } // 拿到mybatis的一些對象 StatementHandler statementHandler = PluginUtils.realTarget(invocation.getTarget()); MetaObject metaObject = SystemMetaObject.forObject(statementHandler); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue('delegate.mappedStatement'); // mappedStatement.getId()為執行的mapper方法的全路徑名,newId為執行的mapper方法的類全名 String newId = mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.')); // 如果不是指定的方法,直接結束攔截 if (!classNames.contains(newId)) {return invocation.proceed(); } String newName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf('.') + 1, mappedStatement.getId().length()); //是否開啟數據權限 boolean isPermi = true; Class<?> clazz = Class.forName(newId); //遍歷方法 for (Method method : clazz.getDeclaredMethods()) {//方法是否含有DataPermission注解,如果含有注解則將數據結果過濾if (method.isAnnotationPresent(DataPermission.class) && newName.equals(method.getName())) { DataPermission dataPermission = method.getAnnotation(DataPermission.class); if (dataPermission != null) {//不驗證if (!dataPermission.isPermi()) { isPermi = false;} else { //開啟驗證 isPermi = true;} }} } if (isPermi){// 獲取到原始sql語句String sql = statementHandler.getBoundSql().getSql();// 解析并返回新的SQL語句,只處理查詢sqlif (mappedStatement.getSqlCommandType().toString().equals('SELECT')) { // String newSql = getNewSql(sql,deptIds,user.getUserId()); sql = getSql(sql,deptIds,user.getUserId());}// 修改sqlmetaObject.setValue('delegate.boundSql.sql', sql); } return invocation.proceed();} catch (Exception e){ logger.error('數據權限隔離異常:', e); return invocation.proceed();} } /** * 解析SQL語句,并返回新的SQL語句 * 注意,該方法使用了JSqlParser來操作SQL,該依賴包Mybatis-plus已經集成了。如果要單獨使用,請先自行導入依賴 * * @param sql 原SQL * @return 新SQL */ private String getSql(String sql,List<Long> deptIds,Long userId) {try { String condition = ''; String permissionSql = '('; if (deptIds.size() > 0){for (Long deptId : deptIds) { if ('('.equals(permissionSql)){permissionSql = permissionSql + deptId; } else {permissionSql = permissionSql + ',' + deptId; }}permissionSql = permissionSql + ')';// 修改原語句condition = DEPT_ID +' in ' + permissionSql; } else {condition = USER_ID +' = ' + userId; } if (StringUtils.isBlank(condition)){return sql; } Select select = (Select)CCJSqlParserUtil.parse(sql); PlainSelect plainSelect = (PlainSelect)select.getSelectBody(); //取得原SQL的where條件 final Expression expression = plainSelect.getWhere(); //增加新的where條件 final Expression envCondition = CCJSqlParserUtil.parseCondExpression(condition); if (expression == null) {plainSelect.setWhere(envCondition); } else {AndExpression andExpression = new AndExpression(expression, envCondition);plainSelect.setWhere(andExpression); } return plainSelect.toString();} catch (JSQLParserException e) { logger.error('解析原SQL并構建新SQL錯誤:' + e); return sql;} }

到此這篇關于Springboot+mybatis-plus+注解實現數據權限隔離的文章就介紹到這了,更多相關Springboot+mybatis-plus+注解實現數據權限隔離內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
天堂日韩电影| 欧美一区二区三区久久| 三上悠亚国产精品一区二区三区| 在线观看亚洲精品福利片| 香蕉成人av| 国产视频网站一区二区三区| 日韩精品网站| 欧美二三四区| 婷婷综合国产| 久久国产毛片| 国产精品密蕾丝视频下载| 蜜臀av国产精品久久久久| 欧美va亚洲va日韩∨a综合色| 麻豆精品久久久| 日本成人一区二区| 日韩精彩视频在线观看| 一区二区三区国产在线| 鲁大师影院一区二区三区| 国产亚洲在线观看| 午夜国产一区二区| 999国产精品| 麻豆国产精品777777在线| 国产亚洲字幕| 精品一区二区男人吃奶| 韩日一区二区| 999久久久精品国产| 五月天久久久| 日本在线成人| 国产经典一区| 麻豆91精品91久久久的内涵| 久久精品国产成人一区二区三区| 日韩欧美精品一区| 亚洲中字黄色| 亚洲精品在线a| 成人日韩av| 亚洲激情另类| 亚州精品视频| 欧美国产美女| 久久成人精品| 美女久久99| 中文亚洲欧美| 国产伦精品一区二区三区视频 | 欧美特黄视频| 国产精品99久久免费| 最新中文字幕在线播放| 最新国产精品视频| 欧美丰满日韩| 日韩一区二区三区精品| 中文字幕在线看片| 手机精品视频在线观看| 亚洲精品观看| 国产一区久久| 欧美日韩夜夜| 性色一区二区| 丰满少妇一区| 欧美永久精品| 免费在线欧美视频| 日韩在线看片| 日韩av影院| 国产日韩综合| 国产精品黑丝在线播放| 欧美久久精品| 日韩高清在线一区| 久久一区二区三区电影| 国产一区二区三区黄网站| 久久精品亚洲人成影院 | 亚洲特色特黄| 波多野结衣久久精品| 国产乱人伦丫前精品视频| 亚洲综合五月| 伊人精品久久| 女同性一区二区三区人了人一| 欧美激情另类| 日韩免费av| 日韩精品电影| 欧美精品中文| 亚洲精品福利| 亚洲欧美在线综合| 亚洲综合福利| 啪啪亚洲精品| 日韩高清三区| 亚洲精品影院在线观看| 亚洲三级国产| 免费在线欧美视频| 亚洲中午字幕| 国产偷自视频区视频一区二区| 国产视频一区在线观看一区免费| 久久一区二区中文字幕| 日韩视频精品在线观看| 黄色成人在线网址| 伊人精品在线| 久久婷婷av| 日韩中文欧美在线| 欧美日韩黄网站| 精品免费av| 好吊视频一区二区三区四区| 日韩精品一二三| 日韩av一区二区三区| 久久精品国产999大香线蕉| 91麻豆国产自产在线观看亚洲| 日本久久成人网| 亚洲精品视频一二三区| 精品视频一二| 日韩视频一区| 国产精品极品在线观看| 成人污污视频| 欧美另类综合| 国产精品男女| 婷婷亚洲综合| 蜜桃精品视频| 夜夜嗨一区二区三区| 欧美久久亚洲| 久久久久91| 91成人小视频| 999国产精品永久免费视频app| 亚洲精品国模| 久久一区二区中文字幕| 欧美亚洲国产日韩| 日韩视频在线一区二区三区| 国产精品一区亚洲| 亚洲91视频| 国产精品麻豆成人av电影艾秋| 亚洲a在线视频| 国产另类在线| 日韩精品一区第一页| 欧美三级第一页| 亚洲欧美久久久| 日韩精品不卡一区二区| 日韩精品视频网站| 日韩在线观看一区| 欧美精品aa| 天堂va欧美ⅴa亚洲va一国产| 精品亚洲美女网站| 国产+成+人+亚洲欧洲在线| 亚洲一二三区视频| 亚洲精品成人| 麻豆精品国产91久久久久久| 日本不卡高清| 国产精品婷婷| 91久久黄色| 日韩午夜av在线| 99国产精品| 美女日韩在线中文字幕| 亚洲深夜福利| 免费日韩av片| 亚洲精品字幕| 日韩精品一区二区三区中文| 亚洲aa在线| 男人天堂欧美日韩| 老牛国产精品一区的观看方式| 国产欧美一区二区三区精品观看| 婷婷激情一区| 欧美不卡在线| 激情婷婷综合| 在线综合亚洲| 美女视频网站久久| 久久久久久色| 亚洲一区二区三区中文字幕在线观看 | 综合国产在线| 欧美日韩一区二区三区四区在线观看| 蜜桃av一区二区在线观看| 亚洲三级精品| 免费在线亚洲欧美| 国产精品亚洲四区在线观看| 欧美一级二区| 免费在线播放第一区高清av| 精品日产乱码久久久久久仙踪林| 欧美午夜网站| 人人香蕉久久| 亚洲精品麻豆| 国产欧美啪啪| 在线视频观看日韩| 国产欧美日韩在线一区二区 | 国产精品magnet| 不卡一二三区| 亚洲乱亚洲高清| 中文字幕色婷婷在线视频| 欧美久久精品一级c片| 欧美日本一区| 午夜av一区| 国产精品片aa在线观看| 香蕉人人精品| 国产亚洲第一伦理第一区| 动漫av一区| 欧美在线不卡| 成人污污视频| 91精品国产自产精品男人的天堂| 日韩欧美一区二区三区在线视频| 欧美专区18| 国产日韩欧美中文在线| 精品国产免费人成网站| 日本午夜精品| 国产婷婷精品| 91精品韩国| 伊人www22综合色| 高清av不卡| 欧美黄色精品| 日韩国产欧美在线播放| 激情婷婷久久| 电影91久久久|