使用spring-boot& amp全局启用hibernate过滤器弹簧数据

时间:2015-05-08 20:38:11

标签: java hibernate spring-boot spring-data spring-data-jpa

我正在尝试使用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 个答案:

答案 0 :(得分:1)

使用休眠过滤器即使在我们的应用程序中也可以轻松实现多租户,即使对于行级ACL也是如此。 可以使用AOP和可在数据库中配置的其他过滤器来代替判别器。在基于访问用户调用请求方法之前,请应用启用了休眠会话过滤器的过滤器并执行请求,并在成功处理请求后禁用过滤器。而已。使用这种方法,您可以将任意数量的过滤器添加到当前用户将要操作的任何数量的实体中,并且可以使用它进行完美的资源(实体和CRUD)管理。