क्लाइंट-साइड और सर्वर-साइड सत्यापन को एक ही स्थान पर प्रबंधित करना


17

मैं इस मामले में बोर्ड पर 100% हूं कि ग्राहक-पक्ष और सर्वर-साइड डेटा सत्यापन दोनों का निश्चित रूप से उपयोग करना चाहिए

हालाँकि, जिन रूपरेखाओं और परिवेशों में मैंने काम किया है, उनमें जो दृष्टिकोण मैंने देखा है वह कभी भी सूखा नहीं है। ज्यादातर समय कोई योजना या पैटर्न नहीं होता है - मान्यताओं को मॉडल कल्पना में लिखा जाता है, और मान्यताओं को दृश्य में फ़ॉर्म में लिखा जाता है। (नोट: मेरे पहले हाथ का अधिकांश अनुभव रेल, सिनात्रा और PHP w / jQuery के साथ है)

इसे खत्म करना, ऐसा लगता है कि एक जनरेटर बनाना मुश्किल नहीं होगा, जो मान्यताओं का एक सेट (उदाहरण के लिए मॉडल का नाम, फ़ील्ड (एस), स्थिति) दिया जाता है, दोनों आवश्यक क्लाइंट-साइड और सर्वर-साइड सामग्री का उत्पादन कर सकता है। वैकल्पिक रूप से, ऐसा उपकरण सर्वर-साइड सत्यापन (जैसे कि validatesActiveRecord मॉडल में कोड) को ले सकता है और क्लाइंट-साइड सत्यापन (जैसे jQuery प्लगइन्स) उत्पन्न करता है, जो तब फ़ॉर्म पर लागू होता है।

जाहिर है, ऊपर सिर्फ एक "हे मुझे यह विचार था" पेशी, न कि एक औपचारिक प्रस्ताव। इस तरह की बात निश्चित रूप से अधिक कठिन है, जैसा कि विचार ने मुझे मारा।

यह मुझे इस सवाल पर लाता है: आप डेटा सत्यापन के लिए "सर्वर पर एक बार लिखने, सर्वर और क्लाइंट पर चलने" की तकनीक कैसे प्राप्त करेंगे?

संबंधित उप-विषयक: क्या ऐसे उपकरण किसी विशेष ढांचे या क्लाइंट-सर्वर प्रौद्योगिकियों के लिए मौजूद हैं? सत्यापन के केवल एक सेट को बनाए रखने की कोशिश करने के साथ प्रमुख गोच या चुनौतियां क्या हैं?

जवाबों:


6

मेरे सीमित अनुभव में, वे बिंदु जहाँ सत्यापन आवश्यक है

  1. HTML का उपयोग कर प्रस्तुति स्तर,
  2. प्रस्तुति के बाद के स्तर पर (यानी, जावास्क्रिप्ट सत्यापन),
  3. संयोजन स्तर पर जहां कई क्षेत्रों के बीच बातचीत को एक साथ मान्य किया जाना है,
  4. व्यापार तर्क स्तर पर और
  5. डेटाबेस स्तर पर।

उनमें से प्रत्येक की अलग-अलग भाषाएं, समय और ट्रिगर हैं। उदाहरण के लिए, पूरे रिकॉर्ड को सुसंगत स्थिति में रखने से पहले किसी क्षेत्र को मान्य करने के लिए यह बहुत कम समझ में आता है, जब तक कि आप सिर्फ एक टुकड़े को मान्य नहीं करना चाहते। डेटाबेस स्तर पर बाधाओं को केवल एक प्रतिबद्ध से पहले अंत में लागू किया जाना चाहिए, और आसानी से टुकड़ा-वार नहीं किया जा सकता है।

एक संबंधित अवधारणा यह है कि डेटा का प्रतिनिधित्व प्रत्येक स्तर के बीच भिन्न होता है। एक सरल उदाहरण एक वेब ब्राउज़र है जो पाठ के एक टुकड़े का प्रतिनिधित्व करता है, शायद, CP1290, जबकि डेटाबेस इसे UTF-8 में प्रस्तुत करता है; दो तारों की लंबाई अलग-अलग होती है, जिससे लंबाई की बाधा अजीब हो जाती है।


हाँ, विभिन्न भाषाओं और चौखटे इस अव्यवहारिक है। "अनुपयुक्त" नहीं है क्योंकि पर्याप्त संसाधनों के साथ यह किया जा सकता है लेकिन भाषाओं के बीच और बीच में ऑटो कन्वर्टर्स एक बड़ा काम है। एक उचित समय सीमा में इसे करना और फिर इसे बनाए रखना प्रासंगिक तकनीकों के परिवर्तन के रूप में बहुत काम आएगा।
माइकल डुरंट

यह निश्चित रूप से सच है कि कई सर्वर-साइड सत्यापन (जैसे एक क्षेत्र की विशिष्टता) को ब्राउज़र में नहीं किया जा सकता है। हालाँकि, यह भी सच है कि किसी भी क्लाइंट-साइड सत्यापन को सर्वर में दोहराया जाना चाहिए, क्योंकि आप क्लाइंट पर भरोसा नहीं कर सकते। यही कारण है कि जहां मैं चीजों को विशेष रूप से उपयोगी होने के लिए DRYing देखता हूं। उदाहरण के लिए, मैं एक मणि देख सकता हूं जो रेल के विस्तार के form_forलिए स्वतः-क्लायंट-साइड सत्यापन कोड प्रदान करने के लिए बहुत उपयोगी है।
दान

5

एक विचार जो अक्सर समाधानों को सीमित करता है वह है नेटवर्क राउंड ट्रिप। क्लाइंट को नेटवर्क पर संदेश भेजे बिना उपयोगकर्ता डेटा को मान्य करना चाहिए। दूसरे शब्दों में, जब उपयोगकर्ता सबमिट बटन दबाता है, तो क्लाइंट को स्थानीय रूप से डेटा को मान्य करना चाहिए।

पहले, मान लेते हैं कि हमारे पास यह सीमा नहीं है। हम एक नेटवर्क एंडपॉइंट के साथ संवाद कर सकते हैं जो सत्यापन मुद्दों को स्पष्ट करने में अच्छा है। उदाहरण के लिए, जब आप अपना नया उपयोगकर्ता रिकॉर्ड इसमें सबमिट करते हैं, तो वेनिला एचटीटीपी त्रुटि कोड के साथ जवाब देने के बजाय, यह एक विस्तृत जेएसएन प्रतिक्रिया दे सकता है जो मुद्दों को आइटम करता है और क्लाइंट चालाकी से प्रदर्शित समस्याओं को प्रतिबिंबित करेगा। समापन बिंदु एक मान्यता गेटवे की भूमिका निभाता है।

यह DRY है लेकिन कमियां के बिना नहीं। सबसे पहले, यह नेटवर्क राउंडट्रिप पर निर्भर करता है जो सत्यापन के साथ हमारे सर्वर पर कर लगाता है जिसे क्लाइंट साइड हैंडल किया जा सकता है। दूसरा, डिजाइन यह अनुमान लगाता है कि सभी CRUD ऑपरेशन हमारे समापन बिंदुओं के माध्यम से होंगे, लेकिन क्या होगा जब डेवलपर्स और प्रक्रियाएं डेटाबेस के खिलाफ सीधे जाकर हमारी डेटा एक्सेस परत को बायपास करती हैं ?

आइए इन कमियों को दूर करने के लिए अपने समाधान पर दोबारा गौर करें। इसके बजाय आइए मेटाडेटा के रूप में हमारी मान्यताओं को संग्रहीत और संप्रेषित करें:

{field: 'username', type: 'required'}
{field: 'username', type: 'unique'} //requires a network roundtrip
{field: 'password', type: 'length', min: 10, max: 50}
{field: 'password', type: 'contains', characters: ['upper', 'special', 'letter', 'number']}

क्लाइंट और सर्वर दोनों के पास इस डेटा की व्याख्या और आवेदन करने के लिए कुछ तंत्र (जैसे एक इंजन) होगा। (कुछ लोग इसे नि: शुल्क मोनाड कहते हैं क्योंकि यह अपने दुभाषिया से घोषणात्मक भाग को अलग करता है।) जावास्क्रिप्ट में हम काम करने वाले कार्यों के लिए जानकारी के प्रत्येक टुकड़े को मैप कर सकते हैं। बूट करने के लिए, हम लगातार मान्यताओं को लागू करने के लिए, हमारे डेटाबेस सहित हमारे आर्किटेक्चर की किसी भी परत को सिखा सकते हैं।


जब आप किसी क्षेत्र को वेब ब्राउज़र, परिवहन, कार्यान्वयन भाषा और डेटाबेस में अलग-अलग तरीके से दर्शाते हैं, तो आप किसी क्षेत्र का वर्णन कैसे करते हैं? उदाहरण के लिए, एक स्ट्रिंग फ़ील्ड का प्रतिनिधित्व करने के लिए आवश्यक बाइट्स की संख्या CP1290 (IE), UTF-8 (JSON), UTF-8 (C #), या UCS-16 (Oracle) का उपयोग करते समय भिन्न होती है। लंबाई की कमी का क्या मतलब है? ब्राउज़र के लिए अधिक महत्वपूर्ण है, जब चरित्र प्रतिनिधित्व ब्राउज़र और ऑपरेटिंग सिस्टम पर निर्भर करता है?
BobDalgleish

इन बाधाओं को मानव पर एक मानसिक मॉडल के रूप में लक्षित किया जाता है। एक प्रोग्रामर के रूप में आपका काम मशीन के मतभेदों को दूर करना है ताकि व्यक्ति को किसी भी तकनीकी मतभेदों के बारे में परवाह न करनी पड़े।
मारियो टी। लैंज़ा

तुम पूरी तरह से चूक गए। अब तक, किसी ने एक अमूर्तता प्रस्तुत नहीं की है जो एक विनिर्देशन के साथ अंत तक सत्यापन की अनुमति देता है। ओपी से, "एक बार लिखें" का तात्पर्य है कि विभिन्न चरणों को संबोधित करने वाले अलग-अलग खंड होने से योग्यता प्राप्त नहीं होती है। इसी तरह, मुझे आपके प्रस्तावित सत्यापन में ऐसा कुछ भी नहीं दिखाई देता है जो इंटरफील्ड या इंटरोबिज सत्यापन को संबोधित करता हो।
BobDalgleish

इंटरफील्ड / ऑब्जेक्ट सत्यापन एक खिंचाव के अधिक नहीं हैं। मेटाडेटा सिर्फ रिश्ते का प्रतिनिधित्व करता है। एक बार लिखें कि मैं एक बार एक सत्यापन लिखता हूं और इसे कई साइटों पर लागू किया गया है, जो यह करता है। आप मेटाडेटा को किसी तालिका में जोड़ते हैं। वह मेटाडेटा किसी भी साइट द्वारा प्राप्त किया जाता है और एक साधारण वर्ग / उपयोगिता / इंजन बाधा को लागू करता है।
मारियो टी। लैंजा

1
ऐसी मान्यता भाषा अत्यंत उपयोगी होगी। यह यूआई गहन वेब अनुप्रयोगों के साथ शामिल कोड के शायद एक तिहाई को बदल सकता है।
BobDalgleish

2

एक तरीका सर्वर और क्लाइंट दोनों तरफ एक ही भाषा / रूपरेखा का उपयोग करना होगा।

उदाहरण के लिए

Node.js :: जावा में क्लाइंट / सर्वर :: जावा में क्लाइंट / सर्वर

इस स्थिति में, अधिकांश "डोमेन ऑब्जेक्ट" कोड सामान्य होगा, जिसमें सत्यापन शामिल होगा। आवश्यकतानुसार कोड रूपरेखा तैयार करेगा। उदाहरण के लिए "सबमिट" और सर्वर साइड वेब सेवा से पहले ब्राउज़र में समान कोड लागू किया जाएगा।

EDIT (जून / 2014): जावा 8 के साथ, अब जावा एप्लीकेशन में भी जेएस सत्यापन कोड को एकीकृत करना आसान है। जावा 8 में एक नया जेएस निष्पादन इंजन है जो अधिक स्थायी है (जैसे: यह इनवोकडेनैमिक का उपयोग करता है)।


जब यह SQL डेटाबेस की बात आती है तो निश्चित नहीं है कि यह कैसे काम करेगा।
माइकल डुरंट

यह उस समस्या को भी हल नहीं करता है कि ब्राउज़र और ऑपरेटिंग सिस्टम इनपुट डोमेन को प्रभावित करते हैं।
BobDalgleish

@ मिचेल ड्यूरेंट, डेटाबेस सत्यापन के लिए डीबी बाधाओं (जैसे विदेशी कुंजी, अद्वितीय आदि) के रूप में लागू किया जाता है। BobDalgleish, 1. ब्राउज़र / ओएस संगतता का मुद्दा एक लाइब्रेरी का उपयोग करके कम किया जा सकता है जो ब्राउज़र के अनुसार रनटाइम को घुमाता है (जैसे कि सेन्चा) 2. ब्राउज़र कॉमैटिबिलिटी सुलीली कोड के "तार्किक" भागों को प्रभावित नहीं करती है जैसे कि सत्यापन, संगतता मुद्दे आमतौर पर होते हैं DOM / UI रेंडरिंग के आसपास।
शमिता वर्मा

0

मैं बस उसी समस्या के बारे में सोच रहा था। मैं C # और जावास्क्रिप्ट दोनों में एक सार वाक्यविन्यास वृक्ष प्राप्त करने के लिए ANTLR का उपयोग करने के बारे में सोच रहा था। वहां से आप ट्री वॉकर का उपयोग भाषा में निर्दिष्ट कार्यों को मान्य करने के लिए वस्तुओं पर लागू करने के लिए करते हैं।

तो फिर आप आवश्यक सत्यापन का विवरण संग्रहीत कर सकते हैं जहां आप कभी भी पसंद करते हैं - संभवतः डेटाबेस में।

इस तरह मैं इस समस्या से संपर्क करूंगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.