属性拦截Grails域类

时间:2010-02-11 17:43:38

标签: grails class dns intercept

我想拦截对域类属性的调用来实现访问控制。

我的第一次尝试是覆盖setProperty和getProperty。通过这样做,我禁用了Grails域类的所有功能,例如

domainClass.properties = params

并自动转换数据类型。

接下来的尝试是使用DelegatingMetaClass,这使我至少能够在实际调用周围打印出一些不错的日志消息。但我无法弄清楚如何访问实际对象来评估权限。

最后,groovy.lang.Interceptor似乎是一个不错的选择,因为我可以访问实际的对象。但这是正确的方法吗?我如何强制拦截所有域类?

提前多多感谢。

问候,丹尼尔

1 个答案:

答案 0 :(得分:4)

只要引用真实版本,就可以覆盖getProperty和setProperty。将这样的代码添加到BootStrap中,为所有域类添加拦截器:

class BootStrap {

   def grailsApplication

   def init = { servletContext ->

      for (dc in grailsApplication.domainClasses) {
         dc.class.metaClass.getProperty = { String name ->
            // do stuff before access
            def result
            def metaProperty = delegate.class.metaClass.getMetaProperty(name)
            if (metaProperty) {
               result = metaProperty.getProperty(delegate)
            }
            else {
               throw new MissingPropertyException(name, delegate.class)
            }
            // do stuff after access
            result
         }

         dc.class.metaClass.setProperty = { String name, value ->
            // do stuff before update
            def metaProperty = delegate.class.metaClass.getMetaProperty(name)
            if (metaProperty) {
               metaProperty.setProperty(delegate, value)
            }
            else {
               throw new MissingPropertyException(name, delegate.class)
            }
            // do stuff after update
         }
      }
   }

   def destroy = {}
}