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

Dan*_*mes 12 java hibernate spring-data spring-data-jpa spring-boot

我试图通过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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hak*_*ata 1

使用 hibernate 过滤器可以轻松实现多租户,甚至可以在我们的应用程序中实现行级 ACL。您可以使用 AOP 和在数据库中配置的不同过滤器来代替鉴别器。在基于访问用户调用请求方法之前,应用启用休眠会话过滤器的过滤器并执行请求,并在成功处理请求后禁用过滤器。就是这样。使用这种方式,您可以将任意数量的过滤器添加到当前用户将要操作的任意数量的实体,并且您可以通过这种方式进行完美的资源(实体和 CRUD)管理。