当我在
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