使用 spring-boot 和 spring-data 全局启用休眠过滤器

我正在尝试通过Spring Boot和Spring Data的鉴别器实现多租户。

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

@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;
    }
}

如何全局启用多租户休眠筛选器?


答案 1

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


答案 2

推荐