2

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

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

domainClass.properties = params

以及数据类型的自动转换。

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

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

提前非常感谢。

问候,丹尼尔

4

1 回答 1

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 = {}
}
于 2010-02-11T18:58:12.393 回答