多租户场景下公用数据源的访问
默认情况下资源是租户隔离的,但是在某些多租户场景下,如果一个用户希望可以访问当前租户对象之外的数据源对象。
关于DatasourceLoader接口
我们可以利用基于SPI技术的DatasourceLoader接口,返回公用租户对象下的数据源资源。
package com.basksoft.core.database.service.datasource;
import com.basksoft.core.database.model.BaskDataSource;
import com.basksoft.core.security.entity.User;
import java.util.List;
public interface DatasourceLoader {
List<BaskDataSource> loadDataSources(User loginUser, String tenantId);
BaskDataSource loadDataSource(User loginUser, String tenantId, String datasourceId);
}
参考实现
import com.basksoft.core.database.manager.datasource.BaskDataSourceManager;
import com.basksoft.core.database.model.BaskDataSource;
import com.basksoft.core.exception.BaskException;
import com.basksoft.core.security.entity.User;
import java.util.List;
public class DefaultDatasourceLoader implements DatasourceLoader {
@Override
public List<BaskDataSource> loadDataSources(User loginUser, String tenantId) {
List<BaskDataSource> datasources1 = BaskDataSourceManager.ins.list(tenantId);
for (BaskDataSource ds:datasources1) {
DatasourceBuilder.parseDataSource(ds);
}
if (!tenantId.equals("TENANT_COMMON")) {
//获取基础租户下的数据源
List<BaskDataSource> datasources2 = BaskDataSourceManager.ins.list("TENANT_COMMON");
for (BaskDataSource ds:datasources1) {
DatasourceBuilder.parseDataSource(ds);
}
datasources1.addAll(datasources2);
}
return datasources1;
}
@Override
public BaskDataSource loadDataSource(User loginUser, String tenantId, String datasourceId) {
BaskDataSource baskDataSource = DataSourceService.ins.loadDatasource(datasourceId);
if (baskDataSource == null) {
throw new BaskException("数据源["+datasourceId+"]不存在!");
}
return baskDataSource;
}
}