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