基于用户的可变数据源
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);
}
}
我目前正在开发后端,并让我的第一个 运行 符合安全法等,这让我的数据库设计稍微复杂了一些:
规格
具有包含有限用户信息(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);
}
}