将数据库连接切换到控制器中的超级用户角色会禁用 JdbcTemplate 更新的行级安全性,但不会禁用 JPA 保存方法

问题描述 投票:0回答:0

当我在

ThreadLocalContext
中清除当前用户时,新的数据库连接调用返回默认的超级用户连接。通过此连接,我可以使用 JdbcTemplate 在启用 RLS 的表上运行更新查询。但是如果我尝试调用 JPA save() 方法,我仍然会收到新行违反行级安全策略错误

@Autowired
private DataSource dataSource;

ThreadLocalStorage.clearDBUser();
System.out.print(DataSourceUtils.getConnection(dataSource).getMetaData().getUserName());
//jdbcTemplate.update("update employee set is_deleted= true where id=?", id);
Employee emp = employeeService.findById(id);
emp.setIsDeleted(true);
employeeRepository.save(emp);

输出是

ERROR: new row violates row-level security policy for table "employee"

因为我有一个

SELECT
RLS
策略来过滤已删除的记录,如果数据库角色不是
UPDATE
,我的
superuser
否则会失败。因此,我必须在调用 JPA
save()
方法之前进行此切换。

ref SO Ans1

ref SO Ans2

ref 所以 Ans3

按照上述答案,但无法解决使用JPA

save()
方法调用和绕过
RLS

postgresql spring-data-jpa jdbctemplate row-level-security
© www.soinside.com 2019 - 2024. All rights reserved.