Java Hibernate hbm文件中的过滤机制对于动态谓词不是很灵活
我正在开发一个Spring框架和hibernate应用程序,其中包含一个中央数据库,用于一个具有 每天大约有1000名用户在线 您可以假设有一个计费应用程序,任何人都可以在自己的帐户上做任何事情(例如,增加其计费金额或 减少他的账单金额) 任何用户都有自己的数据,这些数据通过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
<?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子句谓词。因此,您需要在数据访问层中移动过滤逻辑
@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());
}