电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:29日期: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
相關文章:
主站蜘蛛池模板: 精益专家 - 设备管理软件|HSE管理系统|设备管理系统|EHS安全管理系统 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」| 污水处理设备,一体化泵站,一体化净水设备-「梦之洁环保设备厂家」 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 东莞工作服_东莞工作服定制_工衣订做_东莞厂服 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 锂电池生产厂家-电动自行车航模无人机锂电池定制-世豹新能源 | 变色龙PPT-国内原创PPT模板交易平台 - PPT贰零 - 西安聚讯网络科技有限公司 | 法兰连接型电磁流量计-蒸汽孔板节流装置流量计-北京凯安达仪器仪表有限公司 | 昊宇水工|河北昊宇水工机械工程有限公司 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 直流大电流电源,燃料电池检漏设备-上海政飞 | 圆形振动筛_圆筛_旋振筛_三次元振动筛-河南新乡德诚生产厂家 | 硅PU球场、篮球场地面施工「水性、环保、弹性」硅PU材料生产厂家-广东中星体育公司 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 创富网-B2B网站|供求信息网|b2b平台|专业电子商务网站 | 临沂招聘网_人才市场_招聘信息_求职招聘找工作请认准【马头商标】 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 广州展览制作工厂—[优简]直营展台制作工厂_展会搭建资质齐全 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 中开泵,中开泵厂家,双吸中开泵-山东博二泵业有限公司 | 金属抛光机-磁悬浮抛光机-磁力研磨机-磁力清洗机 - 苏州冠古科技 | 大型果蔬切片机-水果冬瓜削皮机-洗菜机切菜机-肇庆市凤翔餐饮设备有限公司 | 皮带机-带式输送机价格-固定式胶带机生产厂家-河南坤威机械 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 不锈钢轴流风机,不锈钢电机-许昌光维防爆电机有限公司(原许昌光维特种电机技术有限公司) | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 网站seo优化_seo云优化_搜索引擎seo_启新网络服务中心 | 变压器配件,变压器吸湿器,武强县吉口变压器配件有限公司 | 溶氧传感器-pH传感器|哈美顿(hamilton) | 点焊机-缝焊机-闪光对焊机-电阻焊设备生产厂家-上海骏腾发智能设备有限公司 | 美国查特CHART MVE液氮罐_查特杜瓦瓶_制造全球品质液氮罐 | OpenI 启智 新一代人工智能开源开放平台 | 水压力传感器_数字压力传感器|佛山一众传感仪器有限公司|首页 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | CCC验厂-家用电器|服务器CCC认证咨询-奥测世纪 |