【问题标题】:Role based domain class field access in grailsgrails中基于角色的域类字段访问
【发布时间】:2011-01-16 17:11:24
【问题描述】:

我正在开发一个 grails 应用程序。在某些情况下,我想根据角色控制域类字段。因此,在每次调用域类的 getter setter 方法时,我想应用一些基于角色的过滤器(Logged以用户的角色)。我假设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;”此行仅适用于特定角色。对于某些其他角色,它应该引发一些异常。

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

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

【问题讨论】:

    标签: grails acl grails-plugin


    【解决方案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
        }
    }
    

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

    【讨论】:

      【解决方案2】:

      您还可以考虑使用自定义验证器或 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)
              }
          }
      

      【讨论】:

      • 当然,我编辑了帖子以提供我的想法的示例。
      猜你喜欢
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2010-09-11
      • 2017-10-19
      • 2011-04-25
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      相关资源
      最近更新 更多