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

Posted

技术标签:

【中文标题】使用 spring-boot 和 spring-data 全局启用休眠过滤器【英文标题】:Enable hibernate filter globally with spring-boot & spring-data 【发布时间】:2015-07-19 21:08:22 【问题描述】:

我正在尝试通过 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;
    

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

【问题讨论】:

如果有人对如何使用 spring-data 按列进行多租户有更好的了解,我也愿意接受建议。即使不使用休眠过滤器。 您有没有找到一个希望仍然是最新的好的解决方案? 很遗憾,没有。 现在,一年后,您终于找到解决方案了吗?我处于同样的情况,无法让它工作...... 使用 AOP ***.com/a/32230857/320761 【参考方案1】:

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

【讨论】:

***.com/questions/22199971/…

以上是关于使用 spring-boot 和 spring-data 全局启用休眠过滤器的主要内容,如果未能解决你的问题,请参考以下文章

哪些步骤可以使用 Spring-Boot 和 JPA 启用 SQLite?

将 lombok 与 gradle 和 spring-boot 一起使用

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

spring-boot 使用啥版本的 Jackson?

Spring-boot & hibernate,使用事务

为啥 spring-boot 和 postgres 连接会在一段时间后断开?