Grails Spring安全ACL域对象方法受到保护

时间:2013-04-02 16:04:02

标签: grails spring-security acl domain-object

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

它在服务方法上运行良好但我不能使它在域实例方法或域静态方法上工作。

class Dummy {
    string name

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

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

我怎么能这样做?

提前感谢您提供的帮助。

1 个答案:

答案 0 :(得分:1)

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

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