当前位置: 首页 > 知识库问答 >
问题:

使用spring boot全局启用hibernate筛选器

冉俊德
2023-03-14

我正在尝试使用Spring Boot和Spring数据通过鉴别器实现多租户。

我创建了一个抽象类来表示多租户实体。类似于此:

@MappedSuperclass
@FilterDefs({@FilterDef(name = "multi-tenant", parameters = {@ParamDef(name = "tenant", type = "string")})})
@Filter(name = "multi-tenant", condition = "tenant = :tenant")
public abstract class MultiTenantEntity extends GenericEntity {
    @Transient
    private transient String savedTenant;

    @PostLoad
    private void onLoad() throws Exception {
        this.savedTenant = this.tenant;
        onEntityModification();
    }

    @PrePersist
    private void onPersist() {
        if (getId() == null || getId().equals(0l)) {
            tenant = SecurityUtil.getCurrentTenant();
        }
    }

    @PreUpdate
    @PreRemove
    private void onEntityModification() throws Exception {
        String currentTenant = SecurityUtil.getCurrentTenant();

        if (!currentTenant.equals(tenant) || !savedTenant.equals(tenant)) {
            throw new Exception();
        }
    }

    @NotNull
    private String tenant;

    public String getTenant() {
        return tenant;
    }
}

如何全局启用多租户Hibernate过滤器?

共有1个答案

马庆
2023-03-14

在我们的应用程序中,使用hibernate过滤器可以很容易地实现多租户,即使对于行级ACL也是如此。您可以使用AOP和db中可配置的不同过滤器来代替discrimators。在根据访问用户调用请求方法之前,请应用启用hibernate会话筛选器并执行请求的筛选器,并在成功处理请求后禁用筛选器。就是这样。使用这种方式,您可以将任意数量的过滤器添加到将由当前用户操作的任意数量的实体中,并且您可以使用这种方式进行完美的资源(实体和CRUD)管理。

 类似资料:
  • 我试图通过spring启用hibernate过滤器,方法是tyring指向一个用自定义注释注释的服务实现方法并向该方法添加建议。我希望启用自定义筛选器,它在扩展的所有实体上添加一个差异器。因此,我创建了自定义注释,并在需要的方法上使用它。它成功地拦截了该方法,但当我记录变量值时,变量值显示为空,过滤器也没有设置。 该项目是一个Spring-Boot2应用程序,我使用spring aop创建方面。我

  • 我正在为我的Web应用程序使用Spring MVC和HiberNate。我正在寻找一种方法来创建一种全局Hibernate过滤器,该过滤器将应用于我的DAO类中的每个查询,而不必在每个DAO方法中显式启用它。 要求按用户选择的会话变量过滤记录。因此,我们的查询参数将保存在会话中,该会话中的所有DAO查询都需要通过该变量过滤结果。这里的目的是避免每个DAO方法中的所有可重复过滤代码。 欢迎任何想法!

  • 首先,我试图使选择所有复选框,如果我单击表头中的选择所有复选框,整个表行将选择并显示一个复选框反向消息,即我选择了多少复选框。这里的问题是,如果我单击select all复选框,反向消息不会显示楼上的表,即我选择了多少行。 其次,如果我从任何列中筛选任何数字,相同的数字将显示同一列中有多少行具有相同的数字。如果我选中了所有复选框,那么反向消息将显示我选中了多少行复选框。这里,问题是显示整个表行计数

  • 应用筛选器之前的示例使用者记录是(在值中查找GP_ID): 当我在kafkaListenerContainerFactory()中按如下方式设置recordFilterStrategy时: KafKareCordvo.ConvertByteBufferToLong正在将bytebuffer值转换为long值。 但是,当它被Kafka听众按以下方式消费时: 这将返回删除我筛选的字段值的记录:“gp_

  • 我的页面中有一个名为“search_table”的DataTable。我在表中有一个附加的标题行,它具有不同的筛选选项(dropdown、text、date_pickers)。对于日期列,我有两个datepicker,一个用于min,一个用于max。我可以根据datepickers为datatable筛选数据,但有一个问题: 当我选择一个日期时,我的表中的所有行都消失了,我必须点击其中的一个标题(

  • 我有一个带有FireBaseRecyclerAdapter的RecyclerView。当用户开始输入SearchView时,我想用一个名称列表填充RecycerView。 也是对查询进行忽略的方法吗?