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

标签 java hibernate security filter orm

我正在开发一个 Spring 框架和 hibernate 应用程序,其中包含一个企业 Web 应用程序的中央数据库,该应用程序具有 每天约有 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 中的 ([SQL QUERTY IS HERE FOR RESTRICTION ANY USER TO OWN DATA]) 的结尾以 WHERE CLAUSE has userId 参数结束 用于限制用户只能使用自己的数据,并且此 userId 添加到通用存储库的以下方法中。

我将 hbm 的 powerAuthorize 添加到我的通用存储库中,如下所示:

public void applyDefaultAuthorizeFilter(Session session) {
         Filter filter = session.enableFilter("powerAuthorize");
         filter.setParameter("userId", SecurityUtility.getAuthenticatedUser().getId());
      }

此过滤器始终添加到任何查询的末尾以过滤数据。

一切都工作正常,直到我的应用程序的使用者提出了与当前设计不兼容的新需求。消费者现在想要增加另一个用户的账单。

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

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

最佳答案

当条件不变但只有绑定(bind)参数值可能变化时,@Filter 非常有用。

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

  1. 您编写 DAO 方法来根据用户权限过滤 list 。
  2. 您删除了 @Filter,因为 DAO 方法将会执行此操作。

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

关于java - Hibernate hbm 文件中的过滤机制对于动态谓词不是很灵活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43716832/

相关文章:

java - org.hibernate.Session.save() 触发数据库插入

java - 从jsp调用时在hibernate dao中获取空指针

sql-server-2005 - Sql Server 2005 服务的最低权限集是什么?

c# - 通过证书实现传输安全的 WCF

java - 使用 spring mvc 进行国际化

java - 在JavaFX中绑定(bind)两个TableView之间TableColumns的排序行为

java - 创建 bean 时出错

java - 如何在 Java 中创建一个单元测试来确保我的 JPA 数据库实体被延迟加载?

git - 如何从 GitHub 中彻底删除敏感提交?

Java : Iteration through a HashMap, 哪个效率更高?