Spring security and @PostFilter -


मेरे पास यह ऑब्जेक्ट है:

  @ सेवा सार्वजनिक कक्षा myBr {@PostFilter ("filterObject.cellule.getId () == 2") सार्वजनिक सूची & lt; Bibliotheque & gt; GetB () {वापसी super.getAll (); } सार्वजनिक सूची & lt; बिबिलोथेक & gt; GetA () {वापसी getB (); }}  

जब मैं एक परीक्षण से कॉल करता हूं जो myBr.getB () करता है, तो @PostFilter लागू होता है, लेकिन जब मैं myBr.getA () को कॉल करें, पोस्टफ़िल्टर काम नहीं कर रहा है।

क्या इस को संभालने का एक तरीका है, ताकि फ़िल्टर लागू हो?

< P>

समस्या यह है कि @PostFilter को एओपी तकनीक के माध्यम से लागू किया जाता है, फिर भी आप उदाहरण के कार्यान्वयन को GetB () से सीधे getA () , और स्प्रिंग एओपी वर्गों को फिर से लिखना नहीं है।

यहाँ क्या हो रहा है:

  + -------- + + ---------- + getA | पास | प्राप्त करें | | ----- & gt; | ······· & gt; | ----- & gt; | | --- + | | | | | | बीन | | उदाहरण | | This.getB | | | | | GetB | फिल्टर | GetB | | | ----- & gt; | ······· & gt; | ----- & gt; | | & Lt; - + | | | | | + -------- + + ---------- +  

स्प्रिंग एओपी आपकी सेम के प्रतिनिधियों को वास्तविक सेम के रूप में प्रॉक्सी ऑब्जेक्ट कहते हैं, या तो एक जेडीके प्रॉक्सी ऑब्जेक्ट का उपयोग करके (जब आपको एक उपयुक्त इंटरफ़ेस मिल गया है) या डी नोवो वस्तु को संश्लेषित करने के लिए CGLIB का उपयोग करके getA के लिए यह सीधे से गुजरता है, और getB के लिए यह कॉल फ़िल्टरिंग कोड में कॉल को सम्मिलित करता है यह बहुत अच्छा है, लेकिन इसका मतलब यह है कि जब उदाहरण - आपके पास यह के अंदर getA के रूप में मिला है - getB को आह्वान करने के लिए उपयोग किया जाता है सीधे, यह फ़िल्टर को छोड़ देता है और सीधे अंतर्निहित कोड में कूदता है।

इसमें चार संभावित सुधार होते हैं।

  1. एपीपी जेपी का उपयोग करने के लिए एपकेपी का उपयोग करें, जो करता है कोड पुनर्रचना (तैनाती में बहुत अधिक जटिलता की लागत पर)।
  2. उदाहरण के लिए सेम को संभाल दें (स्पष्ट रूप से किया जाना है, आप इसे autowire नहीं कर सकते हैं) और
  3. किसी बीन्स में getB रखें।
  4. दोनों विधियों पर फ़िल्टरिंग रखें।

मैंने अपने आप को विकल्प # 2 का उपयोग किया है (यह मेरी विशेष स्थिति में विकल्प के मुकाबले आसान था) और यह काफी अच्छी तरह से काम करता है, लेकिन सबसे अच्छा विकल्प लगभग निश्चित रूप से # 3 है, ताकि आप को स्वयं करने की ज़रूरत न हो "अंतरफलक" विधियों के लिए कॉल; उस चीज़ को अक्सर एप्लिकेशन की कार्यक्षमता के गलत विभाजन का संकेत मिलता है।


Comments

Popular posts from this blog

c# - sqlDecimal to decimal clr stored procedure Unable to cast object of type 'System.Data.SqlTypes.SqlDecimal' to type 'System.IConvertible' -

Calling GetGUIThreadInfo from Outlook VBA -

Obfuscating Python code? -