1

我的问题是:是否可以保护域对象方法甚至像 findByName 这样的动态方法?

它在服务方法上工作得很好,但我不能让它在域实例方法或域静态方法上工作。

class Dummy {
    string name

    @PostFilter("hasPermission(filterObject, read)")
    static List<Dummy> listDummies(){
        Dummy.list();
    }
}

当从控制器调用时,listDummies 会返回所有虚拟对象,即使没有用户连接也是如此。

我该怎么做才能使它起作用?

提前感谢您提供的帮助。

4

1 回答 1

1

不,这是不可能的。注释通过触发围绕您正在调用的类实例创建代理来工作。这对于 Grails 服务来说是最方便的,因为它们会自动注册为 Spring bean,因此会检测到注释并进行代理。您在代理上进行方法调用,它会执行 ACL 检查,并且只有在允许访问时才调用真实方法。

但是对于静态方法、动态 Groovy 方法或未注册为 Spring bean 的类中的方法,这种代理不会发生。对于此示例,创建一个带注释的服务方法。您仍然可以将所有代码留在域类中,甚至使用动态查找器,但重要的是访问是通过代理服务完成的。一旦进行了检查,您就可以随心所欲地实现逻辑。

于 2013-04-02T16:37:59.313 回答