2016-05-12 86 views
1

我正在使用JPA和Olingo進行一些REST服務。我能夠得到與我的實體類似的基本實現:JPA Olingo Web App使用Olingo和JPA授權

但現在我試圖添加授權,我加入到訪問表,然後相應地篩選結果。我只是想知道是否有一個好的方法來做到這一點,而不必重寫默認行爲。我已經在這裏看到了用於EDM的註釋處理器Annotation Processor,但它似乎不適合我們的模型。

我的問題是:是否有一種簡單的方法來改變Olingo JPA處理器默認連接表和過濾器實體以實現授權?這將要求我能夠通過帳戶來過濾並限制所有結果。

我也嘗試過這裏所描述的預處理和後處理。 Custom JPA Processor但是,過濾需要在查詢中完成,而不是在返回結果後完成,因爲JPA查詢將返回太多結果,並且轉換成千上萬個對象的時間長且成本高昂。

到目前爲止,我已經實現了一個CustomODataJPAProcessor。但是,它需要我現在重寫並重寫org.apache.olingo.odata2.jpa.processor.core.access.data.JPAProcessorImpl#processmethod並用我所需的功能修改JPA查詢。你會看到我實現了一個新的JPAProcessor,在那裏我調用進程併發送我的賬戶。下面是我的代碼看起來像我的CustomODataJPAProcessor的readEntitySet方法:

/* Pre Process Step */ 
    preprocess(); 
    List<String> accounts = new ArrayList<>(); 

    //This is what the original readEntitySet does 
    //ODataJPAFactory.createFactory().getODataJPAAccessFactory().getODataJPAResponseBuilder(oDataJPAContext); 

    //Using custom JPA Processor that I added 
    jpaProcessor = new CustomJPAProcessor(this.oDataJPAContext); 
    CustomJPAProcessor customJPAProcessor = (CustomJPAProcessor)jpaProcessor; 
    List<Object> jpaEntities = customJPAProcessor.process(uriParserResultView, accounts); 

    //What the docs want you to do http://olingo.apache.org/doc/odata2/tutorials/CustomODataJPAProcessor.html 
    //java.util.List<Object> jpaEntities = jpaProcessor.process(uriParserResultView); 

    /* Post Process Step */ 
    postProcess(); 
+1

我的工作類似的問題太多,但我要使用JDBC包裝來解析和轉換SQL,這樣我可以確保DML和本地也查詢。如果您不需要交叉數據庫支持並且您的數據庫支持查詢轉換(Oracel,MS SQL,PostgreSQL,DB2支持Rls開箱即用),則本機行級安全性是更好的選擇。 – jbaliuka

回答

0

我不知道,如果你還是老樣子做這個工作。 我正在解決這個問題。 Olingo提供ODataJPAQueryExtensionEntityListener這個監聽器在執行buildQuery之前的一個步驟由JPAQueryBuilder執行。

使用此無狀態偵聽器,您可以替換buildQuery方法,以便可以訪問和更改包含JPQL查詢的字符串jpqlStatement.toString()。

我認爲是優於本地SQL

再見 多梅尼科