首页 > 解决方案 > 弹簧数据。在运行时更改数据库用户凭据

问题描述

有 Spring Boot 应用程序。为了与 DB 分叉,我使用 Spring Data (JPA + Repository)。

有没有办法根据 API 用户请求更改数据源的数据库用户凭据?我的意思是每个 MVC 请求都必须完全使用他的数据库用户凭据来完成自己的工作。

我已阅读有关 AbstractRoutingDataSource 的信息。但是有一个限制:在运行时不能在 DataSourceMap 中添加数据源。

实际上我想使用 apache PerUserPoolDataSource 并更改数据库用户凭据(使用 Spring Security Context 获取用户信息)

标签: javaspringjpaspring-data-jpaspring-data

解决方案


我找到了解决方案。首先需要定义自定义数据源配置。

@Bean
    public UserCredentialsDataSourceAdapter dataSource() throws ClassNotFoundException {
        final UserCredentialsDataSourceAdapter dataSourceAdapter = new UserCredentialsDataSourceAdapter();
        dataSourceAdapter.setTargetDataSource(perUserPoolDataSource());
        return dataSourceAdapter;
    }

    private PerUserPoolDataSource perUserPoolDataSource() throws ClassNotFoundException {
        DriverAdapterCPDS driverAdapter = new DriverAdapterCPDS();
        driverAdapter.setDriver(properties.getDriverClassName());
        driverAdapter.setUrl(properties.getUrl());
        driverAdapter.setUser(properties.getUsername());//default
        driverAdapter.setPassword(properties.getPassword());//default
        driverAdapter.setAccessToUnderlyingConnectionAllowed(true);

        PerUserPoolDataSource dataSource = new PerUserPoolDataSource();
        dataSource.setConnectionPoolDataSource(driverAdapter);

        return dataSource;
    }

如您所见 - 有来自 Apache 的基本数据源:PerUserPoolDataSource. 作为主要数据源,我将使用UserCredentialsDataSourceAdapter.

然后需要编写自定义过滤器,它将更改成功通过身份验证的用户的用户凭据:

dataSourceAdapter.setCredentialsForCurrentThread(user.getUsername(), user.getPassword());

此解决方案适用于阻塞范式(非反应式)。具有特定用户凭据的一个线程将执行所有查询。


推荐阅读