과도 필드를 사용하여 성배에서 데이터베이스의 쿼리 및 주문 결과
-
19-09-2019 - |
문제
Grails 도메인 객체에서 PAGED 데이터를 표시하려고합니다. 예를 들어 : 나는 일시적 인 속성의 첫 이름과 마지막 이름을 가진 도메인 객체 직원이 있으며, 세터/getter 메소드를 호출 할 때 데이터를 암호화/해독합니다. 데이터는 데이터베이스에 암호화 된 이진 형식으로 저장되므로 해당 필드는 정렬 할 수 없습니다. 그리고 다시 말하지만, 다음과 같은 일시적인 것들에 의해 분류 할 수는 없습니다.http://www.grails.org/gsp+tag+-+sortablecolumn .
이제 나는 다음과 유사한 방식으로 과도를 사용하는 방법을 찾으려고 노력하고 있습니다.
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)
}
}
해결책
Gorm/Hibernate 기준이 실행되는 방식으로 인해 작동 할 수 없습니다. 이러한 주문 지시문은 SQL로 변환되며 데이터베이스 계층에서 발생하기 때문에 비은성 필드에서만 작동 할 수 있습니다.
귀하의 선택은 다음과 같습니다.
- 쿼리 결과를 메모리에로드하고 암호화되지 않은 값으로 스스로 정렬 및 페이지를 수행하십시오.
- 데이터베이스의 암호화 기능과 사용자 정의 쿼리를 사용하십시오 (예 :
select * from employee order by AES_DECRYPT(lastName, key)
"). 이렇게하면 데이터베이스에 많은 추가 부하가 있습니다. - 정렬에 사용할 수있는 암호화되지 않은 형태로 무언가를 저장하십시오. 예 : 마지막 이름의 처음 몇 글자. 그러나 이것은 안전을 유지하려는 정보의 일부를 누출합니다.
제휴하지 않습니다 StackOverflow