2011-02-16 16 views
8

में बाध्यकारी करते समय विशिष्ट फ़ील्ड को सुरक्षित रखें मैं पृष्ठ पर काम कर रहा हूं जो उपयोगकर्ताओं को प्रोफ़ाइल जानकारी संपादित करने की अनुमति देता है। मैं चाहता हूं कि वे अपनी सार्वजनिक जानकारी संपादित कर सकें, लेकिन उन्हें अपने उपयोगकर्ता प्रकार जैसे सिस्टम झंडे को बदलने की अनुमति न दें।वसंत

यह स्प्रिंग एमवीसी (3.0) के साथ लागू किया गया है। उपयोगकर्ता वस्तु ठेठ फ़ील्ड होते हैं जैसे firstName, lastName, email (सभी संपादन योग्य होना चाहिए) और एक बूलियन administrator (जो संपादन योग्य नहीं होना चाहिए

मेरे विधि इस तरह दिखता है:।

@RequestMapping(method = RequestMethod.POST) 
public String doEdit(
     @ModelAttribute("user") User user, 
     BindingResult result, 
     ModelMap model) 
throws IOException 
{ 
     // validate, blah blah 
     // save user object 
     // return page 

} 

मेरे प्रपत्र खेतों firstName, lastName आदि और लग रहा था ठीक काम करने के लिए भी शामिल है।

समस्या यह है कि अगर एक दुर्भावनापूर्ण उपयोगकर्ता पदों पैरामीटर administrator के रूप में "सही" वे इस क्षेत्र को जब वे shouldn सेट कर सकते हैं के साथ एक प्रश्न 'टी।

मुझे पता है कि मैं केवल उन फ़ील्ड के साथ एक अलग "फ़ॉर्म" ऑब्जेक्ट बना सकता हूं जिन्हें मैं बदलना चाहता हूं और स्वचालित बाध्यकारी के लिए इसका उपयोग करता हूं। (डेटा पर प्रतिलिपि)। समस्या यह है कि मेरे पास बहुत सी जगहें हैं जो इस तकनीक का उपयोग करती हैं। (उपयोगकर्ता और अन्य वस्तुओं के लिए)। जब मैं फ़ील्ड जोड़ना चाहता हूं तो इसे बनाए रखने में परेशानी होगी।

क्या स्प्रिंग एमवीसी में एनोटेशन या अन्य तकनीकों का उपयोग करने के लिए पैरामीटर श्वेतसूची और मनमानी डोमेन ऑब्जेक्ट गुणों में परिवर्तन को रोकने का कोई तरीका है?

+3

सिर्फ एक ऐतिहासिक किस्सा, स्प्रिंग इस क्षेत्र में इतने ढीले था, एक दुर्भावनापूर्ण उपयोगकर्ता इंजेक्षन सकता है कि "class.classLoader.URLs []" किसी भी मॉडल वस्तु के लिए, पूरी तरह से सर्वर का नियंत्रण लेने। http://www.springsource.com/security/cve-2010-1622 – irreputable

+1

मैं flabbergasted हूँ। मैंने पिछले हफ्ते उत्पादन में वसंत 3.0.2 से वसंत 3.0.5 तक अपग्रेड किया था। –

उत्तर

10

डेटाबिंडर में allowedFields और disallowedFields नामक दो गुण हैं जो परिभाषित करते हैं कि (डी) बाध्यकारी के लिए क्या अनुमति है। बस का उपयोग अपने @InitBinder विधि में है कि: "myParam"

@InitBinder 
public void initBinder(WebDataBinder binder) { 
    binder.setDisallowedFields("administrator"); 
} 
+0

क्या लॉग इन किए गए उपयोगकर्ता की भूमिका के आधार पर कुछ फ़ील्ड को अनुमति देने का कोई तरीका है। –

+0

यह जावा कोड है, इसलिए प्रोग्राम किए गए तर्क के साथ ऐसा कर सकता है अगर (acl.allowCapability()) –

+0

अच्छा। यह अधिक लचीला लगता है, इसलिए इसे उत्तर के रूप में चिह्नित करें। –

-2

क्लाइंट पक्ष में व्यवस्थापक पैरामीटर नहीं भेजें, इसे सर्वर के पक्ष में नियंत्रित करें।

+0

यह अपने आप में पैरामीटर नहीं है, यह उपयोगकर्ता ऑब्जेक्ट की एक संपत्ति है। मेरा सवाल पूछता है कि क्या इस संपत्ति को अनदेखा करने का कोई तरीका है। –

+0

आपकी उपयोगकर्ता मॉडल ऑब्जेक्ट दृश्य परत पर बंधी है? कुछ लोग सोचते हैं कि यह अच्छा है। मुझे नहीं लगता। हालांकि यह विवादास्पद सवाल है। Http://stackoverflow.com/questions/2680071/dto-or-domain-model-object-in-the-view-layer देखें। जब आप डोमेन ऑब्जेक्ट्स के ओपोजिट में डीटीओ का उपयोग करते हैं तो मेरी टिप्पणी तब होती है। – Iogui

3

आप शैली भाव के साथ अनुरोध पर फ़िल्टर कर सकते संकेत मिलता है कि निर्दिष्ट पैरामीटर अनुरोध में मौजूद होना चाहिए नहीं है।

@RequestMapping(params="!administrator") 
+0

अच्छा। मुझे लगता है कि या तो यह या initBinder विधि काम करेगा। बहुत बुरा मैं दो बार "जवाब" नहीं दे सकता। –