`
flashcloud
  • 浏览: 184898 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

在Grails中使用Hibernate Filter为Domain的所有GORM动态查询添加通用的数据过滤条件

 
阅读更多

      如果在作一个系统时,希望某个用户登录只能查看到属于他自己创建的数据,而这个数据可能是来自很多个不同的实体/表,如电话营销代表登录系统后只能看见属于自己的或自己创建的客户,销售员登录系统后只能看见是自己客户的销售订单...,也就是说我们可能希望在几十个实体类/表,或者在一个超类的所有子类应用中使用一组固定的数据过滤条件,那么这就是Hibernate Filter要做的事情。应用它,你可以以一种非常轻松且安全的方式来实现此类需求。

      在Grails中,我们同样希望在一个或多个Domain的所有动态finder中实现此需求,如findAllByUserName, finderAllByCustomer等等动态的GORM方法调用得么的集合中以自动透明的方式过滤掉一些不在权限范围内的数据,利用Hibernate Filter的Grails插件也可以以Groovy的方式来使用Hibernate Filter了。

      如果在Grails项目中使用了Spring Security Core 的 Grails插件,那么如何与此集成,在Filter中传入用户的一些关键认证信息呢?请参考:

 

class MyDomain {

     Customer customer

     def springSecurityService

     static hibernateFilters = {
          def user = User.load(springSecurityService.principal.id)
          enabledFilter(condition:"customer_id=${user.company.id}", default:true)
      }

}

 

请注意:你必须在condition中使用实际数据库表的字段名称,而不是 Domain 的 field 名称,比如在这段代码中,是“customer_id”而不是customer,否则运行将导致失败。

 

      另外一个值得注意的是,在如下代码中

 

class Employee {
    String name

    static hasMany = [myCustomers:Partner]

    static constraints = {
    }

    static hibernateFilters = {
        enabledPartnersFilter(collection:'myCustomers', default:true)  //注释1
    }
}

class Partner {
    String name
    boolean enabled

    static constraints = {
    }

    static hibernateFilters = {
        enabledFilter(condition:'enabled=1', default:true) 
    }
}

 1. 采用注释1处的代码块,程序无法启动,目前还没找到解决办法,有高手知道的,请指点。

 2. 如果取消注释1处的代码,调用employee.myCustomers()后,不会过滤其中enabled属性为false 的 partner 集合项。     目前还没有时间去研究其解决办法

 

在整个对Hibernate filter Plugin的论证过程中,发现它用于复杂的权限及数据过滤,可能会显得有些力不从心,毕竟Hibernate filter的本质无非是在SQL语句中的where部分自动添加一些额外的查询参数而已,对于大型或者复杂的方案,可能还是得自己通过Groovy式的AOP方式去寻求特定情况下的自定义方案,可以参见我的另一篇博客:在 Grails 中利用闭包实现查询条件的动态构造,利用 Groovy 的闭包和MOP元数据两大杀手锏,你几乎可以做到无所不能。

 

一些参考文档:

1.Hibernate Filter 参考手册:http://oss.org.cn/ossdocs/framework/hibernate/reference-v3_zh-cn/filters.html

2.Hibernate Filter Grails 插件:http://grails.org/plugin/hibernate-filter

3.来自Java Dzone的一篇示例文章:Introduction to Hibernate Filters

4.如何在Filter中定义多个参数的解决方法:http://wuhaixing.iteye.com/blog/305692#comments

5.一封来自Grails邮件列表的讨论:http://grails.1312388.n4.nabble.com/Extending-all-dynamic-finders-with-additional-query-parameters-td1391672.html

6.一封更长的来自Grails邮件讨论列表,提到了它的可用性和不可用性:http://grails.1312388.n4.nabble.com/Dynamic-Hibernate-Filters-tt3390194.html#a3390228

 


以上体会仅供参考。


 

0
3
分享到:
评论
1 楼 oswaldl2 2013-10-25  

相关推荐

    使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf

    使用GORM构建Spring Boot应用程序 Grails指南_ Grails框架.pdf

    Grails GORM查询.pdf

    简单介绍grails的查询操作,已经类似与hibnatate的查询方式

    Grails 中文参考手册

    5.4.2 条件查询 5.4.3 Hibernate查询语言 5.5 高级GORM特性 5.5.1 事件和自动实现时间戳 5.5.2 自定义ORM映射 5.5.2.1 表名和列名 5.5.2.2 缓存策略 5.5.2.3 继承策略 5.5.2.4 自定义数据库标识符 5.5.2.5 复合主键 ...

    Grails权威指南

    第1章 寻找grails之旅  1.1 java的困惑  1.2 webc2.0时代  1.3 java的力量 ... 11.4 在grails中使用spring控制器  11.5 在grails中使用acegi  11.6 使用xfire创建soap服务  11.7 本章小结

    Grails1.1中文文档

    当今的Java Web开发技术显得...所有这些都非常易于使用,这得益于 Groovy 语言的强大以及 Domain Specific Languages (DSLs) 的广泛使用。 本文档将带你从Grails入门开始,最终能够使用Grails框架建设Web应用程序。

    Grails Persistence with GORM and GSQL

    Grails Persistence with GORM and GSQL

    Grails1.1中文文档(CHM)

    Grails1.1最新 中文 文档 当今的Java Web开发技术显得过于复杂,相对于它本身的需要来说。现在主流的Java Web框架也是异常复杂,...与那些框架不同的是,Grails是构建在现有的像Spring、Hibernate这样的Java技术之上。

    grails-开源框架使用指南

    Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路,Grails基于这些概念之上,采用动态方法减小了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构建在Spring和Hibernate等Java...

    Grails中文参考手册

    Grails 中文 参考手册

    grails-pjax:Grails Pjax插件云可帮助您在Grails中使用pjax

    Grails Pjax插件Pjax在Grails中。 Pjax类似于(turbolinks)[ ,在'A'标签,按钮和表单上工作。 参见_pjaxHeader grails templtate文件中的演示代码。 ## Pjax是什么? Pjax是一个jQuery插件,它使用ajax和pushState...

    harmonyos2-grails-hibernate-search-plugin:将HibernateSearch功能集成到Grails

    和声2 Grails ...默认情况下,插件将您的索引存储在此目录中: ~/.grails/${grailsVersion}/projects/${yourProjectName}/lucene-index/development/ 您可以在 application.yml 中覆盖此配置 hibern

    grails-data-mapping:GORM-Groovy对象映射

    该项目为Hibernate和NoSQL数据存储上的GORM的新实现提供了GORM API管道。 [Grails]: : [Groovy]: : 入门 有关更多信息,请参见专用网站: 。 。 执照 Grails和Groovy已根据[Apache许可证,版本2.0] [Apache...

    grails中文参考手册

    grails中文参考手册 学习资料 groovy

    hibernate-metrics:Grails插件使用Hibernate Statistics API报告一些简单的应用程序性能指标

    Grails Hibernate Metrics插件Grails插件使用Hibernate Statistics API报告一些简单的应用程序性能指标。 该插件是在引入的-演示视频可在。 请注意,此插件尚处于初期阶段,应视为实验性的。 在这一点上,我建议仅将...

    GRails 中文帮助文档(参考手册)和安装开发介绍帮助

    Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路,Grails基于这些概念之上,采用动态方法减小了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构建在Spring和Hibernate等Java...

    Grails 教程

    Django和TurboGears这样的动态框架在Web开发领域开辟了一条新的道路,Grails基于这些概念之上,采用动态方法减小了Java平台上进行Web开发的复杂度,不过与那些框架不同的是,Grails是构建在Spring和Hibernate等Java...

    grails 中文第二版

    grails 中文第二版

    grails中文使用手册

    快速学会grails的中文文档,学会grails不再困难

Global site tag (gtag.js) - Google Analytics