sql - 在 SQL 映射表上实施多租户安全性 - JPA、Hibernate、Spring
问题描述
我们的数据库包含 2 个表,task
它们user
由多对多映射表连接,task_assignee
. 两个表都包含一个指示租户的account_id字段。
task_assignee
包含 2 列,“task_id”和“user_id”,它们是 FK 到task.id
和user.id
。
使用 JPA,我将连接建模如下:
public class Task {
...
@ManyToMany(fetch= FetchType.LAZY)
@JoinTable(
name = "task_assignee",
joinColumns = { @JoinColumn(name = "task_id") },
inverseJoinColumns = { @JoinColumn(name = "user_id") }
)
List<User> assignedUsers;
}
我在顶级记录的 API 写入操作上实现多租户安全性,例如task
通过在 DAO 之前将记录“accountId”设置为经过身份验证的调用者帐户,并拒绝任何包含“accountId”的 API 请求。对于读取操作,我们应用会话过滤器,以便任何查询都包含WHERE account_id = {authenticated user account}
. 例如:
Session session = entityManager.unwrap(Session.class);
Filter filter = session.enableFilter("account_id");
filter.setParameter("account_id", 123);
但是,这不会阻止 API 用户添加users
到task
不属于该帐户的帐户。
在添加为受让人之前添加查询以检查 a 是否user
属于a,JPA 可以使用过滤器处理这个吗?account
解决方案
推荐阅读
- c++ - 无法创建函数来查找矩阵的行列式
- laravel - 使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误
- pandas - Pandas 根据另一列中的前 10 个值在一个列中分配值
- html - 当我将鼠标光标放在其中一个元素(例如家庭或联系人)上时,无序列表的元素向右移动大约 5 个像素
- ios - RxSwift:BheaviorRelay 排除默认值
- r - 通过另一个数据帧中的条件过滤一个数据帧
- javascript - 为 Agora 广播添加延迟?
- kotlin - How to remove html tags changed this Unicode of xml 在 kotlin 中更改为 String
- javascript - 如何使用 css 在 chrome mobile 上翻转视频(在全屏模式下)?
- c - 如何在c中实现框模糊?