Hibernate集合的安全装饰器

时间:2012-08-01 09:46:15

标签: java spring hibernate security aop

我面临一个概念性问题:如何过滤Hibernate加载的实体的某些属性的访问权限?

例如:我有一辆车有4个轮子的集合(套装或包)(2个是红色,2个是蓝色;双向链接);用户A有权看到红色和蓝色轮子,用户B只能看到蓝色轮子。当我检索汽车时,也会获取轮子(有时通过Hibernate.initialize,有时通过查询直接获取)。

当我要求汽车时,我想找到一种方法来过滤轮子,只有用户有权查看。 (DB加载后暂时过滤结果)

我希望保持过滤机制不会受到侵扰。

什么行不通:

  • @Filter(或@Where):凭据检查有点棘手,我还有其他一些联接可以知道用户是否被允许看到轮子;

  • Spring ACL:我的凭据管理太难以使用了(此外,不确定它是否能够过滤内部属性);

已实施解决方案:

  • 定义一个自定义UserCollectionType,并提供一个Collection Decorator,仅检索授权数据(重载iterator(),get(int index),...); 缺点:我的收藏不一致:添加数据时,只有当前用户被允许时才能访问。不确定这是一个可靠的解决方案。

其他解决方案:

  • 关于域对象的AOP :我认为这是最好的;在我的域对象上添加AOP,它定义了对其可授权实体集合的访问者,并在访问时过滤它们。不方便:在hibernate加载的域对象上添加AOP可能会有点棘手吗? (参见Spring AOP Advice for Hibernate managed POJO

  • Hibernate拦截器/事件:我试图使用它,但没有找到做我想要的好地方,而不是打扰。而且我不想“真正”修改加载的集合:它必须对hibernate透明(我不希望Hibernate每次用户B在非读取事务中访问它们时都会从汽车中删除红色轮子。)

  • AOP +对公开服务的反思:在事务上下文之外,递归过滤每个实体的每个集合属性以删除未经授权的元素;也许是更简单,更少侵入性的解决方案; 缺点:集合属性无法保持不可修改;

您对实施的解决方案有何看法?关于如何做到这一点的任何其他想法?

(上下文是:Hibernate 4.1.3,Spring 3.1.1,java 7)

谢谢!

0 个答案:

没有答案