java - 弹簧数据。在运行时更改数据库用户凭据
问题描述
有 Spring Boot 应用程序。为了与 DB 分叉,我使用 Spring Data (JPA + Repository)。
有没有办法根据 API 用户请求更改数据源的数据库用户凭据?我的意思是每个 MVC 请求都必须完全使用他的数据库用户凭据来完成自己的工作。
我已阅读有关 AbstractRoutingDataSource 的信息。但是有一个限制:在运行时不能在 DataSourceMap 中添加数据源。
实际上我想使用 apache PerUserPoolDataSource 并更改数据库用户凭据(使用 Spring Security Context 获取用户信息)
解决方案
我找到了解决方案。首先需要定义自定义数据源配置。
@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());
此解决方案适用于阻塞范式(非反应式)。具有特定用户凭据的一个线程将执行所有查询。
推荐阅读
- c - 为结构中的字符数组赋值
- javascript - 对 PHP 后端的 HTTP API 调用出现 SPDY_PROTOCOL 错误
- python - 如何将函数的所有参数保存为字符串?
- c++ - 多对多请求/结果模式的模式
- javascript - 如何根据属性或链接文本(带有 jquery 的 javscript)在网站上查找元素(链接)
- php - 如何从php运行mysql文件?
- r - 将值与 for 循环中的前一行进行比较
- python - 最大限度。对数组的各个部分求和的有效方法
- android - Dialog Fragment 不能将事件传回给 Android 中的 Fragment 调用?
- javascript - 在 creare-react-app - 特定文件中禁用 eslint