785834757 пре 1 година
родитељ
комит
755b3e0c1a

+ 6 - 0
authentication/src/main/java/com/jzg/config/JzgAuthenticationProvider.java

@@ -127,6 +127,8 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
                 jzgUserInfo.setHeadSculpture(MinioUtils.getPresignedObjectUrl("jzg", jzgUserInfo.getHeadSculpture()));
             }
         }
+
+
         //角色数据权限
         List<String> roleIds = userPerms.stream().map(x -> x.getRoleId()).collect(Collectors.toList()).stream().distinct().collect(Collectors.toList());
         List<SysRoleDataScope> sysRoleDataScopes = sysRoleDataScopeMapper.selectList(new LambdaQueryWrapper<SysRoleDataScope>()
@@ -143,6 +145,10 @@ public class JzgAuthenticationProvider implements AuthenticationProvider {
             } else {
                 List<SysRoleDataScope> dataScopes = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("1")).collect(Collectors.toList());
                 dataDeptIds.add(jzgUserInfo.getDeptId());
+                if (!dataScopes.isEmpty()) {
+                    sysRoleDataScopeVo.setDataMark("1");
+                    sysRoleDataScopeVo.setDeptIds(dataDeptIds);
+                }
                 List<SysRoleDataScope> dataScopes3 = sysRoleDataScopes.stream().filter(x -> x.getDataMark().equals("3")).collect(Collectors.toList());
                 List<String> dataScopeLinkRoleIds = dataScopes3.stream().map(x -> x.getRoleId()).collect(Collectors.toList());
                 if(!dataScopeLinkRoleIds.isEmpty()) {

+ 78 - 53
commons/src/main/java/com/jzg/commons/config/DataPermissionInterceptor.java

@@ -1,9 +1,16 @@
 package com.jzg.commons.config;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler;
 import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
 import com.jzg.commons.core.base.BaseController;
 import com.jzg.commons.entity.properties.DataScopeProperties;
+import net.sf.jsqlparser.JSQLParserException;
+import net.sf.jsqlparser.expression.Expression;
+import net.sf.jsqlparser.expression.ExpressionVisitor;
+import net.sf.jsqlparser.parser.CCJSqlParserUtil;
+import net.sf.jsqlparser.parser.SimpleNode;
+import net.sf.jsqlparser.schema.Table;
 import org.apache.ibatis.executor.Executor;
 import org.apache.ibatis.executor.statement.StatementHandler;
 import org.apache.ibatis.mapping.MappedStatement;
@@ -17,23 +24,25 @@ import org.apache.ibatis.session.SqlSessionFactory;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import java.lang.reflect.Field;
 import java.sql.Connection;
 import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 数据权限拦截器
  */
+@Order(2)
 @Intercepts({
         @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}),
 //        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class})
 })
-public class DataPermissionInterceptor implements InnerInterceptor {
+    public class DataPermissionInterceptor implements MultiDataPermissionHandler {
 
     private List<String> ignoredTables;
 
@@ -52,8 +61,6 @@ public class DataPermissionInterceptor implements InnerInterceptor {
         this.dataScopeProperties = dataScopeProperties;
     }
 
-
-
     private boolean shouldIgnoreTable(String sql) {
         for (String table : dataScopeProperties.getTables()) {
             if (sql.toLowerCase().contains(table.toLowerCase())) {
@@ -63,55 +70,73 @@ public class DataPermissionInterceptor implements InnerInterceptor {
         return false;
     }
 
+    private String getTableName(Table table){
+        return String.valueOf(table.getAlias() == null ? table.getName() : table.getAlias().getName());
+    }
+
     @Override
-    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
-
-        try {
-            if(shouldIgnoreTable(boundSql.getSql())) {
-                String currentUserDeptId = baseController.getUserDeptId();
-                String userDataScope = baseController.getUserDataScope();
-                JSONObject dataScope = JSONObject.parseObject(userDataScope);
-                List<String> deptIds = new ArrayList<>();
-                StringBuilder additionalSql = new StringBuilder();
-                //如果数据权限为空   并且用户名为admin 则不做数据权限
-                if(dataScope.isEmpty() && baseController.getUserName().equals("admin")){
-                    return;
-                }
-                if (dataScope.getString("dataMark").equals("2")) {
-                    additionalSql.append(" AND dept_id in (");
-                    additionalSql.append("select id from sys_dept where route like '"+currentUserDeptId+"%'");
-                    additionalSql.append(")");
-                }else {
-                    deptIds = dataScope.getObject("deptIds", List.class);
-                    additionalSql.append(" AND dept_id in (");
-                    deptIds.forEach(deptId -> {
-                        additionalSql.append("'" + deptId + "',");
-                    });
-                    additionalSql.deleteCharAt(additionalSql.length() - 1);
-                    additionalSql.append(")");
-                }
-
-                // 获取原始 SQL
-                String sql = boundSql.getSql();
-
-                if (sql.toLowerCase().contains("select")) {
-                    sql += additionalSql.toString();
-                    Field field = null;
-                    try {
-                        field = BoundSql.class.getDeclaredField("sql");
-                    } catch (NoSuchFieldException e) {
-                        throw new RuntimeException(e);
-                    }
-                    field.setAccessible(true);
-                    try {
-                        field.set(boundSql, sql);
-                    } catch (IllegalAccessException e) {
-                        throw new RuntimeException(e);
-                    }
-                }
+    public Expression getSqlSegment(Table table, Expression where, String mappedStatementId) {
+
+        String currentUserDeptId = baseController.getUserDeptId();
+        String userDataScope = baseController.getUserDataScope();
+        JSONObject dataScope = JSONObject.parseObject(userDataScope);
+        //如果用户名为admin  不做数据权限
+
+        if (dataScope == null || (dataScope.isEmpty() && baseController.getUserName().equals("admin"))) {
+            return where;
+        }
+        StringBuilder additionalSql = new StringBuilder();
+        String tableName = getTableName(table);
+        if(!shouldIgnoreTable(table.getName())) {
+            String fieldName = table.getName().equals("sys_dept") ? "id" : "dept_id";
+            List<String> deptIds = new ArrayList<>();
+            if (dataScope.getString("dataMark").equals("2")) {
+                additionalSql.append(tableName).append(".").append(fieldName).append(" in (");
+                additionalSql.append("select id from sys_dept where route like '").append(currentUserDeptId).append("%'");
+                additionalSql.append(")");
+            } else {
+                deptIds = dataScope.getObject("deptIds", List.class);
+                additionalSql.append(tableName).append(".").append(fieldName).append(" in (");
+                deptIds.forEach(deptId -> {
+                    additionalSql.append("'" + deptId + "',");
+                });
+                additionalSql.deleteCharAt(additionalSql.length() - 1);
+                additionalSql.append(")");
+            }
+            try {
+                return CCJSqlParserUtil.parseCondExpression(additionalSql.toString());
+            } catch (JSQLParserException e) {
+                throw new RuntimeException(e);
             }
-        }catch (Exception e){
-            System.out.printf(e.getMessage());
+        }
+        return null;
+    }
+
+    private static class SqlExpression implements Expression {
+        private final String sql;
+
+        public SqlExpression(String sql) {
+            this.sql = sql;
+        }
+
+        @Override
+        public String toString() {
+            return sql;
+        }
+
+        @Override
+        public void accept(ExpressionVisitor expressionVisitor) {
+
+        }
+
+        @Override
+        public SimpleNode getASTNode() {
+            return null;
+        }
+
+        @Override
+        public void setASTNode(SimpleNode node) {
+
         }
     }
 }

+ 2 - 0
commons/src/main/java/com/jzg/commons/config/MultiTenantHandler.java

@@ -9,6 +9,7 @@ import jodd.util.StringUtil;
 import net.sf.jsqlparser.expression.Expression;
 import net.sf.jsqlparser.expression.StringValue;
 import net.sf.jsqlparser.schema.Column;
+import org.springframework.core.annotation.Order;
 
 import java.util.List;
 
@@ -18,6 +19,7 @@ import java.util.List;
  *
  * @author dongxin
  */
+@Order(1)
 public class MultiTenantHandler implements TenantLineHandler {
 
     private final TenantProperties properties;

+ 6 - 7
commons/src/main/java/com/jzg/commons/config/MyBatisPlusConfig.java

@@ -1,11 +1,10 @@
 package com.jzg.commons.config;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
 import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler;
-import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
 import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
 import com.jzg.commons.core.base.BaseController;
@@ -29,10 +28,10 @@ public class MyBatisPlusConfig {
     @Autowired
     BaseController baseController;
 
-    @Bean
-    public DataPermissionInterceptor dataPermissionInterceptor(DataScopeProperties dataScopeProperties){
-        return new DataPermissionInterceptor(redissonClient,baseController,dataScopeProperties);
-    }
+//    @Bean
+//    public DataPermissionInterceptor dataPermissionInterceptor(DataScopeProperties dataScopeProperties){
+//        return new DataPermissionInterceptor(redissonClient,baseController,dataScopeProperties);
+//    }
 
     @Bean
     public PaginationInnerInterceptor paginationInnerInterceptor(){
@@ -50,7 +49,7 @@ public class MyBatisPlusConfig {
             // 启用多租户插件拦截
             interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new MultiTenantHandler(tenantProperties,baseController)));
         }
-        interceptor.addInnerInterceptor(dataPermissionInterceptor(dataScopeProperties));
+        interceptor.addInnerInterceptor(new DataPermissionInterceptor(new com.jzg.commons.config.DataPermissionInterceptor(redissonClient,baseController,dataScopeProperties)));
         interceptor.addInnerInterceptor(paginationInnerInterceptor());
         return interceptor;
     }