2010-03-12 58 views
3

我試圖從grails域對象中顯示分頁數據。例如: 我有一個domain對象Employee,它的屬性firstName和lastName是瞬態的,當調用setter/getter方法時,它們會加密/解密數據。數據以加密的二進制格式保存在數據庫中,因此無法按這些字段排序。再次,也不能按瞬時排序,如: http://www.grails.org/GSP+Tag+-+sortableColumn使用瞬態字段在grails中查詢和排序數據庫的結果

所以現在我試圖找到一種方法,使用瞬態類似的方式:

Employee.withCriteria(max: 10, offset: 30){ 
    order 'lastName', 'asc' 
    order 'firstName', 'asc' 
} 

類是:

class Employee { 

byte[] encryptedFirstName 
byte[] encryptedLastName 

static transients = [ 
    'firstName', 
    'lastName' 
] 


String getFirstName(){ 
    decrypt("encryptedFirstName") 
} 

void setFirstName(String item){ 
    encrypt("encryptedFirstName",item)  
} 

String getLastName(){ 
    decrypt("encryptedLastName") 
} 

void setLastName(String item){ 
    encrypt("encryptedLastName",item)  
} 

}

回答

2

,可以」由於執行GORM/Hibernate標準的方式而工作。這些順序指令被翻譯成SQL,並且只能在非瞬態字段上運行,因爲它發生在數據庫層。

選項有:查詢到內存的

  1. 負荷的結果,並做排序,並與未加密的值分頁自己。
  2. 使用數據庫的加密功能和自定義查詢(例如「select * from employee order by AES_DECRYPT(lastName, key)」)。要小心,這會給你的數據庫帶來很多額外的負擔。
  3. 以未加密的形式存儲可用於排序的內容。例如:姓氏的前幾個字母。但是,這會泄漏您嘗試保持安全的一些信息。
+0

感謝您的選擇列表,他們沿着我期待的路線走。我確定要避免第一個,因爲它可以吃掉很多應用程序內存。第二個應該工作,如果我的數據庫(MySQL 5.0)確實支持AES_DECRYPT,並且對於最後一個,我真的很想看看是否有一個好的散列alghoritm保留排序但不泄漏信息。 – Azder 2010-03-13 06:11:05

相關問題