簡體   English   中英

tinkerpop框架注釋模型中的覆蓋Getter和Setters

[英]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 )。

例如:

IPerson

@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
    }

}

使用示例(Groovy)

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM