首页 > 解决方案 > 在 SQL 映射表上实施多租户安全性 - JPA、Hibernate、Spring

问题描述

我们的数据库包含 2 个表,task它们user由多对多映射表连接,task_assignee. 两个表都包含一个指示租户的account_id字段。

task_assignee包含 2 列,“task_id”和“user_id”,它们是 FK 到task.iduser.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 用户添加userstask属于该帐户的帐户

在添加为受让人之前添加查询以检查 a 是否user属于a,JPA 可以使用过滤器处理这个吗?account

标签: sqlspringhibernatejpa

解决方案


推荐阅读