DataSourceBindAspect.java 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package jnpf.aop;
  2. import cn.dev33.satoken.context.SaHolder;
  3. import cn.dev33.satoken.router.SaRouter;
  4. import jnpf.base.UserInfo;
  5. import jnpf.config.ConfigValueUtil;
  6. import jnpf.database.util.NotTenantPluginHolder;
  7. import jnpf.database.util.TenantDataSourceUtil;
  8. import jnpf.properties.GatewayWhite;
  9. import jnpf.util.TenantHolder;
  10. import jnpf.util.StringUtil;
  11. import jnpf.util.UserProvider;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.aspectj.lang.ProceedingJoinPoint;
  14. import org.aspectj.lang.annotation.Around;
  15. import org.aspectj.lang.annotation.Aspect;
  16. import org.aspectj.lang.annotation.Pointcut;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.core.annotation.Order;
  19. import org.springframework.stereotype.Component;
  20. /**
  21. *
  22. * @author JNPF开发平台组
  23. * @version V3.1.0
  24. * @copyright 引迈信息技术有限公司
  25. * @date 2021/3/15 17:12
  26. */
  27. @Slf4j
  28. @Aspect
  29. @Component
  30. @Order(1)
  31. public class DataSourceBindAspect {
  32. @Autowired
  33. private ConfigValueUtil configValueUtil;
  34. @Autowired
  35. private GatewayWhite gatewayWhite;
  36. @Pointcut("within(jnpf.*.controller.* || jnpf.controller.*)")
  37. public void bindDataSource() {
  38. }
  39. /**
  40. * NoDataSourceBind 不需要绑定数据库的注解
  41. *
  42. * @param pjp
  43. * @return
  44. * @throws Throwable
  45. */
  46. @Around("bindDataSource() && !@annotation(jnpf.util.NoDataSourceBind)")
  47. public Object doAroundService(ProceedingJoinPoint pjp) throws Throwable {
  48. // System.out.println(SaHolder.getRequest().getRequestPath());
  49. if (configValueUtil.isMultiTenancy()) {
  50. if(StringUtil.isEmpty(TenantHolder.getDatasourceId())){
  51. String url = null;
  52. try{
  53. url = SaHolder.getRequest().getRequestPath();
  54. }catch (Exception e){}
  55. if(url != null){
  56. // 白名单接口不传Token, 不检查租户信息, 要查询数据库需要手动切换租户
  57. boolean isWhiteUrl = SaRouter.isMatch(gatewayWhite.excludeUrl, url) || SaRouter.isMatch(gatewayWhite.whiteUrl, url);
  58. if(!isWhiteUrl) {
  59. UserInfo userInfo = UserProvider.getUser();
  60. log.error("未检测到租户信息, Tenant: {}, URL: {}, TOKEN: {}", userInfo.getTenantId(), url, userInfo.getToken());
  61. return null;
  62. }
  63. }
  64. }
  65. return pjp.proceed();
  66. }
  67. return pjp.proceed();
  68. }
  69. /**
  70. * NoDataSourceBind 不需要绑定数据库的注解 加入不切租户库标记
  71. *
  72. * @param pjp
  73. * @return
  74. * @throws Throwable
  75. */
  76. @Around("bindDataSource() && @annotation(jnpf.util.NoDataSourceBind)")
  77. public Object doAroundService2(ProceedingJoinPoint pjp) throws Throwable {
  78. try{
  79. NotTenantPluginHolder.setNotSwitchAlwaysFlag();
  80. //Filter中提前设置租户信息, 不需要切库的方法进行清除切库
  81. TenantDataSourceUtil.clearLocalTenantInfo();
  82. return pjp.proceed();
  83. }finally {
  84. NotTenantPluginHolder.clearNotSwitchAlwaysFlag();
  85. }
  86. }
  87. }