我正在开发一个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,任何用户都会看到另一个用户的信息,如果我没有跳过过滤器,我就无法实现这个新请求。
是否还有其他机制,模式或其他我可以使用的东西?
答案 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子句谓词。因此,您需要在数据访问层中移动过滤逻辑。
@Filter
,因为DAO方法会改为执行此操作。从长远来看,这种设计也更加灵活。
答案 1 :(得分:0)
您可以使用多个过滤器并根据需要启用/禁用它们。例如。激活你的&#34; powerAuthorize&#34;过滤所有请求,只需启用另一个过滤器&#34; comprehensiveAuthorize&#34;为您的新要求和禁用&#34; powerAuthorize&#34;暂时的。