我目前正在开发一个后端,并且第一次使用安全法等,这使我的数据库设计变得复杂:
包含有限用户信息(user_id,电子邮件,密码(散列和盐渍))的数据库的应用程序的中央服务器可以在任何地方。
使用我们服务的组织要求所有其他信息都存储在内部,因此该特定组织的数据库位于其建筑物中。
我们的中央数据库中的用户ID由这些组织数据库中的多种类型的用户使用,其中存储了有关该用户的更多信息(电话号码,姓名,地址......)
使用Spring Boot,我需要使用它,以便使用的数据源由哪个用户发出请求来确定。我将用户映射到中央服务器内相应组织的数据库,因此信息就在那里,但我不知道如何制作这个变量。
我知道有些方法涉及在application.properties文件中添加另一个数据库配置。但据我所知,一旦服务器部署并运行而没有完全重新部署,这将无法(轻松)更改,我希望以这样的方式构建它,即添加另一个组织只涉及设置其数据库,并将另一个数据库详细信息添加到中央服务器。
我想将CrudRepository与hibernate实体一起使用。我计划只在中央服务器上生成用户ID。
任何指针都会很棒。
谢谢!
答案 0 :(得分:2)
这方面的术语是数据库多租户。多租户有多种策略:不同的数据库,同一数据库中的不同模式,以及具有定义的鉴别器的一个数据库上的相同模式。
您基本上创建了一个DataSourceBasedMultiTenantConnectionProviderImpl类,它根据请求它的租户提供与数据源的连接,以及一个标识谁是请求租户的CurrentTenantIdentifierResolverImpl类。
您可以阅读更多相关信息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);
}
}