Hibernate hbm文件中的过滤机制对动态谓词

时间:2017-05-01 09:16:47

标签: 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在这里限制任何用户自己拥有数据])的结尾是WHERE CLAUSE有userId参数 用于将用户限制为他自己的数据,并且此userId添加了以下通用存储库方法。

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

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

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

在我的应用程序的消费者提出了与当前设计不兼容的新需求之前,一切都运行良好。消费者现在想要增加另一个用户的账单。

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

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

2 个答案:

答案 0 :(得分:1)

当条件没有改变时,public class QCItem : IGriddable { public string[] ColumnHeaders { get; } = new string[] { "Criteria", "Major", "Mass" }; public string RowLinkPrefix { get; } = string.Empty; public bool Selectable { get; } = false; public string Criteria { get; internal set; } public bool Major { get; set; } public int Mass { get; set; } public Sample Sample; } 很有用,但只是绑定参数值可以变化。

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

  1. 您编写DAO方法以根据用户权限过滤库存。
  2. 您删除了@Filter,因为DAO方法会改为执行此操作。
  3. 从长远来看,这种设计也更加灵活。

答案 1 :(得分:0)

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