gpt4 book ai didi

grails - Grails域类的属性拦截

转载 作者:行者123 更新时间:2023-12-02 13:54:20 25 4
gpt4 key购买 nike

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

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

domainClass.properties = params

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

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

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

非常感谢。

问候,丹尼尔

最佳答案

只要引用真实版本,就可以覆盖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 = {}
}

关于grails - Grails域类的属性拦截,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2246362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com