MyTenantLineInnerInterceptor.java 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package jnpf.database.plugins;
  2. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  3. import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
  4. import jnpf.constant.MsgCode;
  5. import jnpf.database.util.DynamicDataSourceUtil;
  6. import jnpf.database.util.NotTenantPluginHolder;
  7. import jnpf.exception.DataException;
  8. import jnpf.util.TenantHolder;
  9. import jodd.util.StringPool;
  10. import lombok.extern.slf4j.Slf4j;
  11. import net.sf.jsqlparser.expression.Expression;
  12. import net.sf.jsqlparser.schema.Column;
  13. import net.sf.jsqlparser.schema.Table;
  14. import net.sf.jsqlparser.statement.select.*;
  15. import org.apache.ibatis.executor.Executor;
  16. import org.apache.ibatis.executor.statement.StatementHandler;
  17. import org.apache.ibatis.mapping.BoundSql;
  18. import org.apache.ibatis.mapping.MappedStatement;
  19. import org.apache.ibatis.session.ResultHandler;
  20. import org.apache.ibatis.session.RowBounds;
  21. import java.sql.Connection;
  22. import java.sql.SQLException;
  23. import java.util.List;
  24. /**
  25. * Column模式租户插件
  26. * @author JNPF开发平台组
  27. * @user N
  28. * @copyright 引迈信息技术有限公司
  29. * @date 2022/10/14 10:29
  30. */
  31. @Slf4j
  32. public class MyTenantLineInnerInterceptor extends TenantLineInnerInterceptor implements ITenantPlugin {
  33. @Override
  34. public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
  35. if(TenantHolder.getLocalTenantCache() == null){
  36. printNoTenant(v -> log.warn("未设置租户信息, 禁止查询数据库, {}, {}, {}, {}", v.getUserId(), v.getUrl(), v.getToken(), v.getStack()));
  37. //未设置租户信息不允许操作数据库
  38. throw new DataException(MsgCode.LOG113.get());
  39. }
  40. //租户指定数据源不处理
  41. if (!TenantHolder.getLocalTenantCache().isColumn()) {
  42. return;
  43. }
  44. if (NotTenantPluginHolder.isNotSwitch()) {
  45. NotTenantPluginHolder.clearNotSwitchFlag();
  46. return;
  47. }
  48. //非主库不切库
  49. if(!DynamicDataSourceUtil.isPrimaryDataSoure()){
  50. return;
  51. }
  52. //不绑定数据源的接口不切库
  53. /*if(NotTenantPluginHolder.isNotSwitchAlways()){
  54. return;
  55. }*/
  56. try {
  57. super.beforeQuery(executor, ms, parameter, rowBounds, resultHandler, boundSql);
  58. } catch (Exception e){
  59. //特殊语句解析失败
  60. if(log.isDebugEnabled()){
  61. log.debug("语句解析失败", e);
  62. }
  63. }
  64. }
  65. @Override
  66. public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
  67. if(TenantHolder.getLocalTenantCache() == null){
  68. printNoTenant(v -> log.warn("未设置租户信息, 禁止查询数据库, {}, {}, {}, {}", v.getUserId(), v.getUrl(), v.getToken(), v.getStack()));
  69. //未设置租户信息不允许操作数据库
  70. throw new DataException(MsgCode.LOG113.get());
  71. }
  72. //租户指定数据源不处理
  73. if (!TenantHolder.getLocalTenantCache().isColumn()) {
  74. return;
  75. }
  76. if (NotTenantPluginHolder.isNotSwitch()) {
  77. NotTenantPluginHolder.clearNotSwitchFlag();
  78. return;
  79. }
  80. //非主库不切库
  81. if(!DynamicDataSourceUtil.isPrimaryDataSoure()){
  82. return;
  83. }
  84. //不绑定数据源的接口不切库
  85. /*if(NotTenantPluginHolder.isNotSwitchAlways()){
  86. return;
  87. }*/
  88. try {
  89. super.beforePrepare(sh, connection, transactionTimeout);
  90. } catch (Exception e){
  91. //特殊语句解析失败
  92. if(log.isDebugEnabled()){
  93. log.debug("语句解析失败", e);
  94. }
  95. }
  96. }
  97. @Override
  98. protected Column getAliasColumn(Table table) {
  99. return getAliasColumnWithFromItem(table);
  100. }
  101. protected Column getAliasColumnWithFromItem(FromItem table) {
  102. StringBuilder column = new StringBuilder();
  103. if (table.getAlias() != null) {
  104. column.append(table.getAlias().getName());
  105. }else{
  106. if(table instanceof Table){
  107. column.append(((Table)table).getName());
  108. }
  109. }
  110. column.append(StringPool.DOT).append(super.getTenantLineHandler().getTenantIdColumn());
  111. return new Column(column.toString());
  112. }
  113. protected void appendSelectItem(List<SelectItem<?>> selectItems, FromItem from) {
  114. if (CollectionUtils.isEmpty(selectItems)) {
  115. return;
  116. }
  117. if (selectItems.size() == 1) {
  118. SelectItem item = selectItems.get(0);
  119. Expression expression = item.getExpression();
  120. if (expression instanceof AllColumns) {
  121. return;
  122. }
  123. }
  124. // 改
  125. selectItems.add(new SelectItem<>(getAliasColumnWithFromItem(from)));
  126. }
  127. @Override
  128. protected void processInsertSelect(Select selectBody, final String whereSegment) {
  129. if (selectBody instanceof PlainSelect) {
  130. PlainSelect plainSelect = (PlainSelect)selectBody;
  131. FromItem fromItem = plainSelect.getFromItem();
  132. if (fromItem instanceof Table) {
  133. this.processPlainSelect(plainSelect, whereSegment);
  134. // 改
  135. this.appendSelectItem(plainSelect.getSelectItems(), fromItem);
  136. } else if (fromItem instanceof Select) {
  137. Select subSelect = (Select)fromItem;
  138. // 改
  139. this.appendSelectItem(plainSelect.getSelectItems(), fromItem);
  140. this.processInsertSelect(subSelect, whereSegment);
  141. }
  142. } else if (selectBody instanceof ParenthesedSelect) {
  143. ParenthesedSelect parenthesedSelect = (ParenthesedSelect)selectBody;
  144. this.processInsertSelect(parenthesedSelect.getSelect(), whereSegment);
  145. }
  146. }
  147. }