基于用户的可变数据源

Variable datasource based on user

我目前正在开发后端,并让我的第一个 运行 符合安全法等,这让我的数据库设计稍微复杂了一些:

规格

具有包含有限用户信息(user_id、电子邮件、密码(散列和加盐))的数据库的应用程序的中央服务器可以在任何地方。

使用我们服务的组织要求所有其他信息都存储在内部,因此该特定组织的数据库就在他们的大楼里。

我们中央数据库中的用户 ID 被这些组织数据库中的多种类型的用户使用,其中存储了有关该用户的更多信息(phone 号码、姓名、地址...)

问题

使用 Spring 引导,我需要进行设置,以便使用的数据源由发出请求的用户决定。我将用户映射到中央服务器内相应组织的数据库,因此信息就在那里,但我不确定如何创建此变量。

我知道有一些方法涉及在 application.properties 文件中添加另一个数据库配置。但据我所知,一旦部署了服务器并且 运行ning 没有完全重新部署,这就不能(轻易地)改变,我希望以添加另一个组织的方式构建它只涉及设置他们的数据库,并将另一个数据库详细信息添加到中央服务器。

额外的细节

为此,我想将 CrudRepository 与休眠实体一起使用。我计划只在中央服务器上生成用户 ID。

任何指点都会很棒。

谢谢!

这方面的术语是数据库多租户。多租户有多种策略:不同的数据库,同一数据库中的不同模式,以及具有定义的鉴别器的一个数据库上的相同模式。

您基本上创建了一个 DataSourceBasedMultiTenantConnectionProviderImpl class,它根据请求它的租户提供与数据源的连接,以及一个 CurrentTenantIdentifierResolverImpl class,它标识谁是请求租户。

您可以阅读更多相关信息 here。由于您的每个租户都有自己的数据库,您可能希望关注多租户分离数据库方法。当我实现它时,它与 CrudRepository 一起工作得很好。您可能还想找到自己的方式来创建租户地图,因为我有 2 个租户并且无需在任何时候添加更多租户。

这是我实现此连接时的连接提供程序示例:

public class DataSourceBasedMultiTenantConnectionProviderImpl extends AbstractDataSourceBasedMultiTenantConnectionProviderImpl {

    private static final String DEFAULT_TENANT_ID = "A";

    @Autowired
    private DataSource datasourceA;

    @Autowired
    private DataSource datasourceB;

    private Map<String, DataSource> map;

    @PostConstruct
    public void load() {
        map = new HashMap<>();
        map.put("A", datasourceA);
        map.put("B", datasourceB);
    }

    @Override
    protected DataSource selectAnyDataSource() {
        return map.get(DEFAULT_TENANT_ID);
    }

    @Override
    protected DataSource selectDataSource(String tenantIdentifier) {
        return map.get(tenantIdentifier);
    }
}