3

我正在开发一个 grails 应用程序。在某些情况下,我想根据角色控制域类字段。所以在每次调用域类的 getter setter 方法时,我想应用一些基于角色的过滤器(登录用户角色)。我假设grails将在运行时为domin类创建getter setter方法。所以在编写grails代码时是否可以应用这个逻辑。如果可能那么如何应用?

例子:

域类:

class Book{
   String name;
   double price;

  }

控制器:

def index={
  Book book=Book.get(1);
   println book.name;
   println book.price;
 }

在上面的代码中“println book.price;” 此行应仅适用于特定角色。对于某些其他角色,它应该引发一些异常。

有可能实现吗?有没有插件可以做到这一点?

请对此提供一些帮助....谢谢

4

2 回答 2

1

您可以为要控制访问的属性创建 get/set 方法,并将您的安全逻辑放在那里。假设您已经编写了自己的安全服务或正在使用像 Spring Security (Acegi) 插件这样的安全插件,您将:

class Book{
    String name;
    double price;

    def authenticateService

    void setPrice(double price) {
        if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
            throw new Exception("You are not authorized to set book prices")
        }
        this.price = price
    }

    double getPrice() {
        if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
            throw new Exception("You are not authorized to get book prices")
        }
        return this.price
    }
}

我不知道有任何插件允许对域属性进行访问控制。

于 2010-02-14T16:41:59.510 回答
0

您还可以考虑使用自定义验证器或 spring 错误对象在保存之前捕获设置字段的尝试。

编辑:这是我在想的一个例子。您可以进行更多概括,并且此处的代码尚未经过测试,因此它可能不会按原样运行。

class securedDomain {
    String securedField

    def fieldSetBy = [:]
    def previousValue = [:]
    static transients = ['fieldSetBy', 'previousValue']

    static constraints = {
        securedField(validator: { v, o ->
             def access = User.findByName(fieldSetBy['securedField']).hasAccess('securedField')
             if(!access) securedField = previousValue['securedField']
             return access
        })

    void setProperty(String name, value) {
        if(name == "securedField") {
            fieldSetBy['securedField'] = session.user
            previousValue['securedField'] = securedField
            securedField = value
        } else {
            super(name, value)
        }
    }
于 2010-02-15T16:07:33.753 回答