基于用户的可变数据源

时间:2018-05-22 16:06:16

标签: database hibernate security spring-boot distributed

我目前正在开发一个后端,并且第一次使用安全法等,这使我的数据库设计变得复杂:

规范

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

使用我们服务的组织要求所有其他信息都存储在内部,因此该特定组织的数据库位于其建筑物中。

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

问题

使用Spring Boot,我需要使用它,以便使用的数据源由哪个用户发出请求来确定。我将用户映射到中央服务器内相应组织的数据库,因此信息就在那里,但我不知道如何制作这个变量。

我知道有些方法涉及在application.properties文件中添加另一个数据库配置。但据我所知,一旦服务器部署并运行而没有完全重新部署,这将无法(轻松)更改,我希望以这样的方式构建它,即添加另一个组织只涉及设置其数据库,并将另一个数据库详细信息添加到中央服务器。

额外细节

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

任何指针都会很棒。

谢谢!

1 个答案:

答案 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);
    }
}