Java Hibernate hbm文件中的过滤机制对于动态谓词不是很灵活

Java Hibernate hbm文件中的过滤机制对于动态谓词不是很灵活,java,hibernate,security,filter,orm,Java,Hibernate,Security,Filter,Orm,我正在开发一个Spring框架和hibernate应用程序,其中包含一个中央数据库,用于一个具有 每天大约有1000名用户在线 您可以假设有一个计费应用程序,任何人都可以在自己的帐户上做任何事情(例如,增加其计费金额或 减少他的账单金额) 任何用户都有自己的数据,这些数据通过hbm文件中的过滤机制保护给特定用户: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Ma

我正在开发一个Spring框架和hibernate应用程序,其中包含一个中央数据库,用于一个具有 每天大约有1000名用户在线

您可以假设有一个计费应用程序,任何人都可以在自己的帐户上做任何事情(例如,增加其计费金额或 减少他的账单金额)

任何用户都有自己的数据,这些数据通过hbm文件中的过滤机制保护给特定用户:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping default-lazy="true">
    <class name="org.myoffice.Inventory" table="Core_INVENTORY">
       <id name="id" column="Id" type="java.lang.Long">
            <generator class="sequence" >
                <param name="sequence">SEQ_INVENTORY</param>   
            </generator>
        </id>

        <many-to-one    name="bill"             column="bill_ID"        entity-name="org.myoffice.Bill" not-null="true" unique-key="unq_StrHouse_Smp_Pn_Exp"/>
        <property       name="expireDate"       column="expire_Date"    type="date" unique-key="unq_StrHouse_Smp_Pn_Exp"/>   
        <many-to-one    name="user"             column="user_id"        entity-name="org.myoffice.User" not-null="true"  update="false" />

        <many-to-one    name="createdBy"        column="CreatedBy"      entity-name="org.myoffice.User" not-null="true"  update="false" />
        <many-to-one    name="updatedBy"        column="UpdatedBy"      entity-name="org.myoffice.User" not-null="true"  />
        <property       name="createdDate"      column="CreatedDate"    type="date"         not-null="true" update="false" />
        <property       name="updatedDate"      column="UpdatedDate"    type="date"         not-null="true"/>   
        <property       name="ip"               column="IP"             type="string"       not-null="true"/>


        <filter name="powerAuthorize" condition="[SQL QUERTY IS HERE FOR RESTRICTION ANY USER TO OWN DATA]"/>           
    </class>
</hibernate-mapping>
此筛选器始终添加到筛选数据的任何查询的末尾

在我的应用程序的消费者提出与当前设计不兼容的新需求之前,一切都很正常。消费者现在希望增加另一个用户的账单

如果我跳过过滤器hbm,任何用户都会看到另一个用户的信息,如果我不跳过过滤器,我就无法实现这个新请求


是否有其他机制、模式或其他我可以使用的方法?

当条件不变时,
@Filter
很有用,但只有bind参数值可以变化

这里需要的是过滤WHERE子句谓词。因此,您需要在数据访问层中移动过滤逻辑

  • 您可以编写DAO方法来根据用户权限过滤库存
  • 您可以删除
    @Filter
    ,因为DAO方法将执行此操作

  • 从长远来看,这种设计也更加灵活。

    您可以使用多个过滤器,并根据需要启用/禁用它们。例如,为所有请求激活“powerAuthorize”过滤器,只需为您的新需求启用另一个过滤器“comprehensiveAuthorize”,并禁用“powerAuthorize”暂时性。

    正如我从您的帖子中所述,我在存储库中编写了一些方法,而不是在hbm文件中进行筛选,并根据情况调用其中的任何一个方法,以附加到任何查询的结尾。是否正确?我已经解决了您的解决方案中的问题,但有一个问题是,如果此筛选器全部或一半用于应用程序,我必须更改所有这些,如果将来在此对象[org.myoffice.Inventory]上请求新的开发需求,则必须注意此禁用/启用在更改它时有一个中心解决方案,由于必须为每个hibernate会话启用过滤器,因此代码中可能有一个中心位置可以处理过滤器。我对Spring不是很熟悉,但是是否有任何获取hibernate会话的代码可以被操纵/重写?是处理中央过滤器的好地方。。。
    public void applyDefaultAuthorizeFilter(Session session) {
             Filter filter = session.enableFilter("powerAuthorize");
             filter.setParameter("userId", SecurityUtility.getAuthenticatedUser().getId());
          }