多租户场景下公用数据源的访问

默认情况下资源是租户隔离的,但是在某些多租户场景下,如果一个用户希望可以访问当前租户对象之外的数据源对象。

关于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;
    }
}

results matching ""

    No results matching ""