如果在作一个系统时,希望某个用户登录只能查看到属于他自己创建的数据,而这个数据可能是来自很多个不同的实体/表,如电话营销代表登录系统后只能看见属于自己的或自己创建的客户,销售员登录系统后只能看见是自己客户的销售订单...,也就是说我们可能希望在几十个实体类/表,或者在一个超类的所有子类应用中使用一组固定的数据过滤条件,那么这就是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
以上体会仅供参考。
分享到:
相关推荐
GORM查询还支持布尔逻辑操作符,这为复合条件查询提供了极大便利。开发者可以使用AND和OR操作符来组合多个查询条件,以实现更复杂的查询逻辑。 在操作过程中,GORM提供的查询方式不仅限于上述内容,还包括criteria...
在本教程中,我们将探讨如何使用GORM(Grails Object-Relational Mapping)构建Spring Boot应用程序。GORM是Grails框架的核心部分,它为开发者提供了简单、强大的数据持久化功能,支持Hibernate和MongoDB等数据库。...
在Grails中,数据查询是核心功能之一,允许开发者高效地与数据库交互。 ### 1. GORM (Grails Object Relational Mapping) GORM是Grails的核心组件,提供了一种简单的方式来处理数据持久化。它是一个ORM(对象关系...
这表明本书旨在帮助读者了解并掌握如何在Grails项目中使用GORM来管理数据持久化。 #### 部分内容解析: **第一章:定义GORM中的模型** - **GORM的目标**:介绍了GORM的基本概念及其在Grails框架中的角色,以及它...
GORM 是 Grails 的内置 ORM 框架,它允许开发者使用 Domain Class 来定义数据模型,并自动提供数据库操作。GORM 支持 Hibernate 和 ActiveJDBC,使得数据库操作更加简单。 **Controllers** Controllers 在 Grails ...
Grails的控制器通过拦截器链进行扩展,可以添加自定义的行为和过滤逻辑。 **Grails 的核心特性** 1. **自动化配置和约定优于配置**:Grails 提供了许多默认配置,例如数据库连接、URL映射等,开发者只需按照约定...
在 Grails 应用中,过滤器(Filters)是一个重要的概念,它们允许开发者在执行控制器操作之前或之后执行某些逻辑,从而实现诸如身份验证、日志记录、数据验证等跨控制器的功能。 ### 1. 过滤器的概念 过滤器是 ...
Grails是一个基于Groovy语言的全栈框架,它遵循约定优于配置的原则,并且紧密集成Spring和Hibernate等流行的Java库,简化了开发流程。Grails在IT行业中尤其受到重视,因为它能够帮助开发者快速搭建并部署基于MVC模式...
在这个开源项目中,开发者可以了解到如何利用Grails Datastore GORM Plugin Support来提升Android应用的数据管理效率,同时结合MVC模式,使代码结构更加清晰。通过深入研究"Prestige-master"中的代码,开发者能够...
- 使用`grails war`或`grails package`命令打包应用为WAR文件。 - 可以部署到任何支持Servlet 2.5规范的容器中,如Tomcat、Jetty等。 **所支持的Java EE容器** - 支持Tomcat、Jetty等多种流行的Java EE容器。 - ...
Grails的GORM(Grails Object Relational Mapping)是Hibernate的一个封装,使得ORM操作更为简便,支持动态查询和 Criteria 查询等高级功能。 ### Grails插件系统 Grails拥有一个丰富的插件生态系统,允许开发者...
《Grails中文使用手册》是为开发者提供的一份详尽指南,旨在帮助用户快速掌握Grails框架的使用方法。Grails是一种基于Groovy语言的开源Web应用框架,它结合了模型-视图-控制器(MVC)架构模式,旨在提高开发效率,...
在IT行业中,GORM是一个非常重要的工具,尤其在Grails框架中,它是处理数据库操作的主要接口。本篇文章将深入探讨GORM的独立启动(Standalone)功能,这使得开发者可以在不依赖整个Grails应用的情况下使用GORM的强大...
第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 本章小结
2. **View**:Grails使用GSP(Groovy Server Pages)作为视图,类似于JSP,但更灵活,允许在页面中直接嵌入Groovy代码,实现动态内容的生成。 3. **Controller**:控制器负责处理用户请求,管理业务逻辑,接收表单...
在Grails与GORM中,处理这种关联特别简单,只需要在领域类中定义相应的属性和关系,FreeMarker模板则可以用来动态地展示这些关联数据。 例如,假设我们有一个`User`类和一个`Post`类,`User`可以有多个`Post`,那么...
在这个例子中,你可能学会了如何在Grails中使用`groovy.sql.Sql`类或者HQL(Hibernate Query Language)进行定制化查询。 3. **分页功能**:在Web应用中,数据分页是很常见的需求。Grails提供了方便的分页API,可以...
- Domain Classes:在Grails中,我们使用Domain Classes来定义数据模型。这些类是Groovy类,包含了属性和方法,它们自动与数据库表关联。 - GORM注解:我们可以使用注解如`@Entity`、`@Table`等来自定义数据表的...