2010-02-14 109 views
3

我正在開發Grails應用程序。在這種情況下,我想根據角色控制域類字段。所以在每次調用getter setter方法的域類時我都想要應用一些基於角色的過濾器(登錄用戶的角色)。我假設grails會在運行時爲佔優的類創建getter setter方法。因此,在編寫grails代碼時可以應用這種邏輯。如果可能,那麼如何應用?在grails中基於角色的域類字段訪問

實施例:

域類:

class Book{ 
    String name; 
    double price; 

    } 

控制器:

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

在上面的代碼 「的println book.price;」這條線只適用於特定的角色。對於其他角色,它應該拋出一些異常。

有沒有可能實現?有沒有插件可以做到這一點?

請給一些這方面的幫助....謝謝

回答

1

您可以創建要控制訪問,把你的安全邏輯的屬性外get/set方法。假設你寫你自己的安全服務或使用的安全插件,如春季安全(的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 
    } 
} 

我不知道任何插件,允許訪問控制要在域屬性放。

0

您也可以考慮使用自定義驗證器或彈簧錯誤對象來捕獲在保存之前設置字段的嘗試。

編輯:這是我在想什麼的例子。你可以概括更多一點,這裏的代碼還沒有經過測試,所以它可能不會按原樣運行。

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) 
     } 
    } 
+0

您能否提供一些示例代碼。 – DonX 2010-02-16 02:53:30

+0

當然,我編輯了這篇文章,給我一個我在想什麼的樣本。 – Blacktiger 2010-02-16 15:27:29