我想拦截对域类属性的调用来实现访问控制。
我的第一次尝试是覆盖setProperty和getProperty。通过这样做,我禁用了Grails域类的所有功能,例如
domainClass.properties = params
并自动转换数据类型。
接下来的尝试是使用DelegatingMetaClass,这使我至少能够在实际调用周围打印出一些不错的日志消息。但我无法弄清楚如何访问实际对象来评估权限。
最后,groovy.lang.Interceptor似乎是一个不错的选择,因为我可以访问实际的对象。但这是正确的方法吗?我如何强制拦截所有域类?
提前多多感谢。
问候,丹尼尔
答案 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 = {}
}