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 ()
को कॉल करें, पोस्टफ़िल्टर काम नहीं कर रहा है।
क्या इस को संभालने का एक तरीका है, ताकि फ़िल्टर लागू हो?
समस्या यह है कि @PostFilter
को एओपी तकनीक के माध्यम से लागू किया जाता है, फिर भी आप उदाहरण के कार्यान्वयन को GetB ()
से सीधे getA ()
, और स्प्रिंग एओपी वर्गों को फिर से लिखना नहीं है।
यहाँ क्या हो रहा है:
+ -------- + + ---------- + getA | पास | प्राप्त करें | | ----- & gt; | ······· & gt; | ----- & gt; | | --- + | | | | | | बीन | | उदाहरण | | This.getB | | | | | GetB | फिल्टर | GetB | | | ----- & gt; | ······· & gt; | ----- & gt; | | & Lt; - + | | | | | + -------- + + ---------- +
स्प्रिंग एओपी आपकी सेम के प्रतिनिधियों को वास्तविक सेम के रूप में प्रॉक्सी ऑब्जेक्ट कहते हैं, या तो एक जेडीके प्रॉक्सी ऑब्जेक्ट का उपयोग करके (जब आपको एक उपयुक्त इंटरफ़ेस मिल गया है) या डी नोवो वस्तु को संश्लेषित करने के लिए CGLIB का उपयोग करके getA
के लिए यह सीधे से गुजरता है, और getB
के लिए यह कॉल फ़िल्टरिंग कोड में कॉल को सम्मिलित करता है यह बहुत अच्छा है, लेकिन इसका मतलब यह है कि जब उदाहरण - आपके पास यह
के अंदर getA
के रूप में मिला है - getB
को आह्वान करने के लिए उपयोग किया जाता है सीधे, यह फ़िल्टर को छोड़ देता है और सीधे अंतर्निहित कोड में कूदता है।
इसमें चार संभावित सुधार होते हैं।
- एपीपी जेपी का उपयोग करने के लिए एपकेपी का उपयोग करें, जो करता है कोड पुनर्रचना (तैनाती में बहुत अधिक जटिलता की लागत पर)।
- उदाहरण के लिए सेम को संभाल दें (स्पष्ट रूप से किया जाना है, आप इसे autowire नहीं कर सकते हैं) और
- किसी बीन्स में
getB
रखें।- दोनों विधियों पर फ़िल्टरिंग रखें।
- किसी बीन्स में
मैंने अपने आप को विकल्प # 2 का उपयोग किया है (यह मेरी विशेष स्थिति में विकल्प के मुकाबले आसान था) और यह काफी अच्छी तरह से काम करता है, लेकिन सबसे अच्छा विकल्प लगभग निश्चित रूप से # 3 है, ताकि आप को स्वयं करने की ज़रूरत न हो "अंतरफलक" विधियों के लिए कॉल; उस चीज़ को अक्सर एप्लिकेशन की कार्यक्षमता के गलत विभाजन का संकेत मिलता है।
Comments
Post a Comment