我的问题是:是否有可能保护域对象方法,甚至动态方法,如findByName?
它在服务方法上工作得很好,但我不能让它在域实例方法或域静态方法上工作。
class Dummy {
string name
@PostFilter("hasPermission(filterObject, read)")
static List<Dummy> listDummies(){
Dummy.list();
}
}
当从控制器调用listDummies时,即使没有用户连接,也会返回所有的dummies。
我怎么做才能使它工作?
事先感谢您提供的帮助
不,这不可能。注释通过触发在所调用的类实例周围创建代理来工作。这对于Grails服务来说是最方便的,因为它们会自动注册为Spring bean,因此注释会被检测到并被代理。您在代理上进行方法调用,它执行ACL检查,并且只在允许访问时调用真正的方法。
但是对于静态方法、动态Groovy方法或未注册为Spring bean的类中的方法,这种代理不会发生。对于本例,创建一个带注释的服务方法。您仍然可以将所有代码留在域类中,甚至可以使用动态查找器,但重要的是访问是通过代理服务完成的。一旦检查发生,您就可以在任何您想要的地方实现逻辑。