[英]Overriding Getters and Setters in tinkerpop Frames annotated model
我正在開發一個新軟件,希望對數據庫中的值進行加密。 我們正在使用OrientDB,並正在嘗試使用tinkerpop庫實施該項目。 在這里,我有點卡住了。
對於一個函數,我需要提取所有類型的頂點的列表並返回它們。 我為person對象添加了帶注釋的接口,並且現在添加了用於加密和解密必要字段的方法。 但是,當我解密它們時,它將解密后的值保留回數據庫中。
有沒有一種方法可以覆蓋getter和setter來處理那時的加密/解密,或者我需要在執行解密之前將模型與數據庫分離?
這是我的界面代碼:
public interface iPerson {
@Property("firstName")
public void setFirstName(String firstName);
@Property("firstName")
public String getFirstName();
@Property("lastName")
public String getLastName();
@Property("lastName")
public void setLastName(String lastName);
@Property("id")
public String getId();
@Property("id")
public void setId(String id);
@Property("dateOfBirth")
public String getDateOfBirth();
@Property("dateOfBirth")
public void setDateOfBirth(String dateOfBirth);
@JavaHandler
public void encryptFields() throws Exception;
@JavaHandler
public void decryptFields() throws Exception;
public abstract class Impl implements JavaHandlerContext<Vertex>, iPerson {
@Initializer
public void init() {
//This will be called when a new framed element is added to the graph.
setFirstName("");
setLastName("");
setDateOfBirth("01-01-1900");
setPK_Person("-1");
}
/**
* shortcut method to make the class encrypt all of the fields that should be encrypted for data storage
* @throws Exception
*/
public void encryptFields() throws Exception {
setLastName(Crypto.encryptHex(getLastName()));
setFirstName(Crypto.encryptHex(getFirstName()));
if(getDateOfBirth() != null) {
setDateOfBirth(Crypto.encryptHex(getDateOfBirth()));
}
}
/**
* shortcut method to make the class decrypt all of the fields that should be decrypted for data display and return
* @throws Exception
*/
public void decryptFields() throws Exception {
setLastName(Crypto.decryptHex(getLastName()));
setFirstName(Crypto.decryptHex(getFirstName()));
if(getDateOfBirth() != null) {
setDateOfBirth(Crypto.decryptHex(getDateOfBirth()));
}
}
}
}
(我假設)設置了Vertex的屬性后,數據會持久保存到數據庫中。 如果要將加密的值存儲在數據庫中,則需要確保在設置屬性時對值進行加密。
如果要覆蓋@Property
getter / setter方法的默認行為(以便您可以添加en / decryption),我建議使用自定義處理程序(例如@JavaHandler
)。
例如:
@JavaHandlerClass(Person.class)
public interface IPerson extends VertexFrame {
@JavaHandler
public void setFirstName(String firstName);
@JavaHandler
public String getFirstName();
}
abstract class Person implements JavaHandlerContext<Vertex>, IPerson {
@Override
void setFirstName(String firstName) {
asVertex().setProperty('firstName', encrypt(firstName))
}
@Override
String getFirstName() {
return decrypt(asVertex().getProperty('firstName'))
}
static String encrypt(String plain){
return plain.toUpperCase(); // <- your own implementation here
}
static String decrypt(Object encrypted){
return encrypted.toString().toLowerCase(); // <- your own implementation here
}
}
// setup
IPerson nickg = framedGraph.addVertex('PID1', IPerson)
IPerson jspriggs = framedGraph.addVertex('PID2', IPerson)
nickg.setFirstName('nickg')
jspriggs.setFirstName('jspriggs')
// re-retrieve from Frame vertices sometime later...
IPerson nickg2 = framedGraph.getVertex(nickg.asVertex().id, IPerson)
IPerson jspriggs2 = framedGraph.getVertex(jspriggs.asVertex().id, IPerson)
// check encrypted values (these are stored in the DB)...
assert nickg2.asVertex().getProperty('firstName') == 'NICKG'
assert jspriggs2.asVertex().getProperty('firstName') == 'JSPRIGGS'
// check decrypted getters...
assert nickg2.getFirstName() == 'nickg'
assert jspriggs2.getFirstName() == 'jspriggs'
如果使用Groovy
,則可以以編程方式攔截對這些方法的調用(這很好,因為您可以繼續使用@Property
批注)。
除了編寫自己的自定義處理程序(也許嘗試擴展JavaHandlerModule
嗎?)以外,我不確定是否有Tinkerpop
解決方案來攔截這些調用。
感謝您的評論,我應該早點回復此問題,但是最近我找到了解決我問題的更好的方法。 我一直在尋找一種使加密/解密發生的方法,而不會產生開銷,也沒有開發人員真正注意到它的發生。
解決此問題的更好方法實際上是在插入/更新之前和讀取之后編寫鈎子,以便僅在數據庫層進行處理。 我能夠用Java編寫它,打包一個jar文件並將其安裝在我們的orientDB實例上,完美無瑕地拾取了它,並幫助我們加密了必要的字段而沒有注意到速度降低。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.