क्या माइक्रोसर्विस को उपयोगकर्ता होना चाहिए?


13

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

हमारी निम्नलिखित आवश्यकताएँ हैं:

  1. उपयोगकर्ताओं को कुछ भूमिकाएं निभाने के लिए सीमित होना चाहिए। उदाहरण के लिए, एक उपयोगकर्ता को केवल उस सामग्री को बनाने / संशोधित करने / पढ़ने में सक्षम होना चाहिए जो वह स्वयं करता है।

  2. माइक्रोसर्विसेज को केवल उन अनुमतियों तक सीमित होना चाहिए जिनकी उन्हें आवश्यकता है। उदाहरण के लिए, एक माइक्रोसेवा जिसे केवल किसी अन्य सेवा से डेटा पढ़ने की आवश्यकता है, उस सेवा में डेटा लिखने से स्पष्ट रूप से मना किया जाना चाहिए।

एक उदाहरण के रूप में, मान लें कि हमारे पास एक प्रणाली है जहां उपयोगकर्ता चित्र को एक छवि स्टोर सेवा पर अपलोड कर सकते हैं। हमारे पास एक टैगिंग सेवा है जो स्वचालित रूप से किसी स्थान के साथ चित्रों को टैग करती है। उपयोगकर्ता केवल अपने स्वयं के चित्र CRUD कर सकते हैं। टैगिंग सेवा छवि स्टोर सेवा से किसी भी छवि को पढ़ सकती है, हालांकि संशोधित / हटाने में सक्षम नहीं होना चाहिए।

JWT टोकन का उपयोग करके उपरोक्त प्राप्त करने का एक अच्छा तरीका क्या है? कुछ समाधान जिनके बारे में हमने चर्चा की है वे हैं:

  1. छवि स्टोर सेवा 2 एपीआई को उजागर करती है, एक जो बाहरी रूप से उपलब्ध है (उपयोगकर्ता सीआरयूडी एक्सेस दे रही है), और एक जो आंतरिक रूप से उपलब्ध है (आंतरिक रीड-ओनली एक्सेस दे रही है)। अनम्य लगता है - क्या होगा यदि किसी अन्य आंतरिक सेवा को सभी छवियों तक पढ़ने / लिखने की आवश्यकता होती है (उदाहरण के लिए जो स्वचालित रूप से स्पष्ट छवियों को हटाता है)?

  2. हम उपयोगकर्ता की JWT में दो अनुमतियाँ सेट करते हैं, जिनमें से एक CRUD_OwnImages है, दूसरा READ_ForAnalysis है। टैगिंग सेवा यह देख सकती है कि क्या उपयोगकर्ता के पास READ_ForAnalysis अनुमतियाँ हैं, और यदि ऐसा है, तो उचित अनुरोध करें। हमारे पास एक और माइक्रोसेवा है जो यह देखने के लिए जांचता है कि उपयोगकर्ता के स्वयं के चित्रों पर CRUD संचालन के लिए उपयोगकर्ता के पास CRUD_OwnImages है या नहीं। यह सुनिश्चित करने के लिए प्रत्येक माइक्रो-सर्विस पर जिम्मेदारी डालता है कि उपयोगकर्ता को उन कार्यों के लिए प्रतिबंधित किया जाता है जिनकी उसे आवश्यकता होती है। छवि की दुकान में इस दृष्टिकोण के साथ प्रत्येक माइक्रोसिस्ट को प्रतिबंधित करने का कोई तरीका नहीं है, इसलिए यह संभावित रूप से परतदार और त्रुटि प्रवण है।

  3. हम अनुमति के रूप में READ_ForAnalysis के साथ टैगिंग माइक्रोसिस्ट को अपना उपयोगकर्ता देते हैं। फिर, जब टैगिंग सेवा छवि स्टोर से छवियों का अनुरोध करती है, तो इसे उन तक पहुंच दी जाती है, लेकिन उन्हें संशोधित करने से मना किया जाता है। उपयोगकर्ता के उपयोगकर्ता के पास केवल CRUD_OwnImages अनुमति है, इसलिए वह दृश्यपटल से केवल अपनी छवियों को पुनर्प्राप्त और प्राप्त करने में सक्षम है। यदि किसी अन्य सेवा को सभी डेटा के लिए CRUD की आवश्यकता है, तो हम इसे CRUD_AllData या समान दे सकते हैं। हम इस दृष्टिकोण को पसंद करते हैं क्योंकि प्रत्येक सेवा अब अपने स्वयं के डेटा (उस तर्क के बजाय कई सेवाओं में दोहराई जा रही है) के लिए ज़िम्मेदार है, लेकिन क्या होगा यदि सेवा को उपयोगकर्ता की अनुमति और माइक्रोसर्विस दोनों अनुमतियों की आवश्यकता हो? क्या हम सुरक्षित रूप से दो JWT टोकन (उपयोगकर्ता और microservice दोनों) भेज सकते हैं? क्या अनुमतियों को सुरक्षित रूप से संयोजित करने और उस माध्यम से भेजने का कोई तरीका है? जैसे

यदि उपयोगकर्ता जानकारी को और नीचे की ओर (2 या 3 माइक्रोसेवर्सर) की आवश्यकता होती है, तो समस्या समाप्त हो जाती है। क्या हम केवल यह मान लेते हैं कि यह व्यक्तिगत माइक्रोसर्विसेज पर निर्भर है कि वे अपने आप को उन कार्यों तक सीमित कर सकें जिनकी उन्हें आवश्यकता है, और यह स्पष्ट नहीं है?


1
क्या आप इन माइक्रोसर्विसेज के एकमात्र डेवलपर हैं, या अन्य कंपनियों / संगठनों / विभागों (यानी सुरक्षा सीमा के साथ कुछ भी) भी आपके सिस्टम को लक्षित करने वाले माइक्रोसॉफ़्ट लिखते हैं?
रॉबर्ट हार्वे

1
यह बहुत संभावना है कि सिस्टम को धूमिल करने वाली अन्य सेवाएं होंगी, और हम उस मामले के लिए डिज़ाइन करना चाहते हैं।
awr

जवाबों:


6

सामान्य तौर पर, जितना संभव हो उतने ऑपरेशन एक वास्तविक, मानव उपयोगकर्ता से बंधे होने चाहिए। यह लोगों को सही तरीके से प्रमाणित करने के लिए मजबूर करता है, यह एक एकल सुसंगत प्राधिकरण रणनीति के लिए धक्का देता है, और यह एक सुसंगत लेखा परीक्षा प्रदान करने का एक महत्वपूर्ण हिस्सा है।

और सामान्य तौर पर, आपके पास तीन प्रकार के परिदृश्य होते हैं:

1. उपयोगकर्ता आता है, एक तस्वीर अपलोड करता है, और इसे टैग करने की आवश्यकता होती है। महान। फोटो सेवा सिर्फ JWT के साथ टैगिंग सेवा (या आपकी निर्भरता की दिशा के आधार पर) के पास से गुजर सकती है और यदि उपयोगकर्ता के पास उचित कार्रवाई करने के लिए अधिकारों का अभाव है, तो आप उचित कार्रवाई कर सकते हैं (शायद एक टैग के बिना फोटो अपलोड करें , हो सकता है कि त्रुटि वापस, शायद कुछ और)।

2. उपयोगकर्ता आता है, एक फोटो अपलोड करता है, और इसे टैग करने की आवश्यकता होती है ... लेकिन अभी नहीं। ठंडा। आप अब सामान्य रूप से फ़ोटो को संभालें। बाद में, जब टैगिंग होती है (ईवेंट / मैसेज हैंडलिंग, CQRS स्टाइल कमांड प्रोसेसिंग, कुछ आवधिक नौकरी प्रसंस्करण, जो भी हो) टैगिंग सेवा उपयोगकर्ता को प्रतिरूपित करेगी (सबसे अधिक संभावना एक साझा रहस्य का उपयोग करके एक कस्टम JWT से अनुरोध करने के लिए) और फिर मूल अनुरोधकर्ता (उनकी सभी अनुमतियों और सीमाओं के साथ) की ओर से उप-संचालन। इस पद्धति में असिंक्रोनस ऑपरेशंस की सामान्य समस्या है जहाँ चीजें आसानी से नहीं होने पर उपयोगकर्ता को वापस त्रुटी प्रदान करना मुश्किल होता है, लेकिन यदि आप क्रॉस-सर्विस ऑपरेशंस के लिए इस पैटर्न का उपयोग कर रहे हैं, तो आप पहले ही इसका हल कर लेंगे।

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

आपके परिदृश्य, आपकी आवश्यकताओं और आपकी जोखिम सहिष्णुता के आधार पर किसका उपयोग करना अलग-अलग होगा। और हां, ये व्यापक स्ट्रोक सामान्यीकरण का सिर्फ एक अधूरा सेट हैं।

लेकिन सामान्य तौर पर, यदि संभव हो तो माइक्रोसर्विस स्वयं उपयोगकर्ता नहीं होना चाहिए।


1
आपके पहले और अंतिम पैराग्राफ विरोधाभासी नहीं हैं?
रॉबर्ट हार्वे

1
नहीं? संचालन एक उपयोगकर्ता से बंधा होना चाहिए। माइक्रोसोर्सेज स्वयं उपयोगकर्ता नहीं हैं ... मैं स्पष्ट करूँगा।
तेलस्टीन

1
मुझे उस समस्या का हल मिल गया जिसमें सुझाव दिया गया था: प्रत्येक माइक्रोसेवा के लिए एक गुंजाइश निर्धारित करना जो निर्दिष्ट करता है कि कौन से समापन बिंदु एक्सेस किए जा सकते हैं, इसके एक्सेस टोकन में। उपयोगकर्ता के JWT आईडी टोकन को एक अलग हेडर के रूप में भी पास करें। इस तरह हम माइक्रोसर्विसेज और यूजर्स (रक्षा में गहराई) दोनों को सीमित कर सकते हैं। मैनिंग के
awr

परिदृश्य 3 एक दिलचस्प है, जो आंशिक रूप से हमें यह तय करने के लिए प्रेरित करता है कि उपयोगकर्ताओं को माइक्रोसेवा होना चाहिए। लेकिन ऐसा लगता है कि नियम के बजाय एक अपवाद हो सकता है।
awr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.