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

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

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

瀏覽:86日期: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久久,三上悠亚国产精品一区二区三区
99riav国产精品| 综合国产在线| 免费日韩成人| 国产精品一区毛片| 美腿丝袜亚洲三区| 国产在视频一区二区三区吞精| 久久免费精品| 水蜜桃精品av一区二区| 精品视频在线观看网站| 国产亚洲高清在线观看| 国产精品一区二区av日韩在线| 欧美激情福利| 日韩在线第七页| 欧洲激情综合| 三级一区在线视频先锋| 亚洲综合福利| 国产精品流白浆在线观看| 美女av一区| 欧美一区久久久| 久久高清免费| 只有精品亚洲| 国产美女亚洲精品7777| 精品九九久久| 99精品视频在线| 亚洲精品一二三区区别| 亚洲精一区二区三区| 国产乱码精品一区二区三区亚洲人 | 国产精品夜夜夜| 麻豆极品一区二区三区| 日韩精品看片| 日韩精品欧美大片| av最新在线| 老牛影视一区二区三区| 国产亚洲高清在线观看| 色爱综合网欧美| 黄色成人91| 国产精品一区亚洲| 国内精品福利| 日本麻豆一区二区三区视频| 成人日韩av| 欧美天堂亚洲电影院在线观看| 亚洲久久在线| 国产精品福利在线观看播放| 国产亚洲毛片在线| 国产欧美成人| 91精品国产成人观看| 日韩一区二区三免费高清在线观看 | 人在线成免费视频| 男人操女人的视频在线观看欧美| 国产美女久久| 欧美日韩少妇| 蜜桃久久久久| 在线精品亚洲| 国产精品专区免费| 亚洲91网站| 91精品韩国| 欧美中文一区| 久久久水蜜桃av免费网站| 日韩精品亚洲专区在线观看| 色一区二区三区| 7777精品| 欧美~级网站不卡| 久久成人av| 丝袜美腿一区二区三区| 岛国av在线播放| 日本欧美大码aⅴ在线播放| 久久国产电影| 精品国产aⅴ| 91欧美日韩在线| 国产一区91| 日韩电影免费网址| 国产精品入口久久| 免费日韩av片| 欧洲一级精品| 免费亚洲婷婷| 亚洲精品系列| 色88888久久久久久影院| 国产精品对白久久久久粗| 免费高清在线一区| 欧美日韩在线二区| 成人精品国产亚洲| 国产精品亚洲人成在99www| 视频一区视频二区中文字幕| 欧美韩日一区| 国产九九精品| 一区二区精品| 国产国产精品| 日韩精品永久网址| 久久久久九九精品影院| 日本午夜精品久久久久| 亚洲欧美高清| 久久男女视频| 日本蜜桃在线观看视频| 欧美成人一二区| 欧美亚洲一区二区三区| 中文字幕av一区二区三区四区| 红桃视频欧美| 久久五月天小说| 亚洲三级欧美| 精品日产乱码久久久久久仙踪林| 国产亚洲精品美女久久| 一区二区三区四区在线观看国产日韩 | 国产精品久一| 国产欧美一区二区精品久久久 | 高清精品久久| 久久精品网址| 麻豆中文一区二区| 免费一区二区三区在线视频| 国产精品嫩模av在线| 97久久超碰| 奇米亚洲欧美| 日本午夜精品| 国产亚洲精品美女久久| 日韩高清一级| 亚洲97av| 日韩精品免费视频一区二区三区| 好看的亚洲午夜视频在线| 久久精品国内一区二区三区水蜜桃| 欧美激情99| 开心激情综合| 日产精品一区二区| 日韩欧美精品| 久久三级视频| 午夜av一区| 亚洲少妇诱惑| 亚洲天堂免费| 欧美日本精品| 久久精品国产99国产| 精品三级国产| 亚洲精品一级二级| 欧美理论视频| 久久成人一区| 日欧美一区二区| 久久精品xxxxx| 国产精品一区亚洲| 国产一区二区三区亚洲| 91亚洲国产成人久久精品| 日韩伦理在线一区| 激情综合亚洲| 美女91精品| 日韩av二区在线播放| 久久av国产紧身裤| 国产欧洲在线| 好吊视频一区二区三区四区| 中文字幕日韩高清在线| 91av一区| 国产美女亚洲精品7777| 久久免费精品| 91精品亚洲| 久久夜色精品| 97成人超碰| 一区二区三区四区日本视频| 午夜久久影院| 四虎精品永久免费| 欧美亚洲色图校园春色| 精品久久影院| 欧美99久久| 日本欧美一区二区在线观看| 精品国产麻豆| 9色精品在线| 国产精品麻豆成人av电影艾秋| 国产一区二区三区四区大秀| 99精品网站| 日韩精品久久理论片| 一本色道久久精品| 国产精品亚洲一区二区在线观看| 精品国模一区二区三区| 中文字幕日韩亚洲| 精品视频免费| 夜夜精品视频| 国产精品九九| 色婷婷精品视频| 亚洲综合福利| 深夜福利视频一区二区| 在线一区二区三区视频| 欧美激情福利| 欧美日韩国产一区精品一区| 91大神在线观看线路一区| 中文字幕在线看片| 日韩精品一二三四| 久久久精品国产**网站| 黄色国产精品| 欧美国产视频| 亚洲成人日韩| 亚洲午夜黄色| 国产亚洲一区二区三区啪| 亚洲成av在线| 久久激五月天综合精品| 欧美 日韩 国产精品免费观看| 91成人精品观看| 福利视频一区| 亚洲精选久久| 欧美黄色网页| 国产精品一区二区精品视频观看| 日本成人手机在线| 欧美在线资源| 午夜av不卡| 国产精品一级| 在线亚洲免费| 在线日韩av|