12

मैं डीडीडी + सीक्यूआरएस + इवेंट सोर्सिंग के साथ एक ऐप तैयार करने की सोच रहा हूं, और मुझे कुछ परेशानी है कि उपयोगकर्ता ऑथ कैसे करें।इवेंट सोर्सिंग अनुप्रयोगों में उपयोगकर्ता एथ

उपयोगकर्ता आंतरिक रूप से मेरे डोमेन का हिस्सा हैं, क्योंकि वे ग्राहकों के लिए ज़िम्मेदार हैं। मैं एएसपी.नेट एमवीसी 4 का उपयोग कर रहा हूं, और मैं केवल सरल स्मृति का उपयोग करना चाहता था। लॉग इन करने और उपयोगकर्ताओं को अधिकृत करने के बाद से एक तुल्यकालिक ऑपरेशन है, यह अंततः एक सतत वास्तुकला में कैसे निपटाया जाता है?

क्या मुझे अपना खुद का ऑथ सिस्टम रोल करना होगा जहां मैं पढ़ने वाले पक्ष पर denormalized auth टेबल रखता हूं? इसकी सुरक्षा कैसे संभालें? क्या मैं अपने इवेंट स्टोर और मेरी व्यू टेबल दोनों में पासवर्ड हैश संग्रहीत करना समाप्त कर दूंगा?

तो कई सवाल, किसी को भी कुछ प्रकाश डाला सकता है, मैं बहुत आभारी :)

tldr हो सकता है; इवेंटसोर्स-एप्लिकेशन में आप उपयोगकर्ता एथ कैसे करते हैं?

+0

उसी तरह आप संदेश आधारित सिस्टम में यह कर, AFAIK। आप प्रमाणीकरण और प्रमाणीकरण मिश्रण लगते हैं। आप सुरक्षित करने की कोशिश कर रहे हैं क्या? –

+0

मैं उन्हें मिश्रण नहीं कर रहा हूं, मैं वास्तव में दोनों के बारे में पूछ रहा हूं :) मेरी मुख्य समस्या यह है कि मुझे नहीं पता कि यह संदेश आधारित सिस्टम में कैसे किया जाता है;) – tuxbear

उत्तर

9

प्रत्येक "डोमेन" या व्यावसायिक घटक को डीडीडी या सीक्यूआरएस का उपयोग नहीं करना है। ज्यादातर मामलों में, उपयोगकर्ता की जानकारी वास्तव में क्रुद्ध होती है, इसलिए आप आमतौर पर इसके लिए डीडीडी का उपयोग नहीं कर सकते हैं। अन्य डोमेन वास्तव में वास्तविक उपयोगकर्ता पर निर्भर नहीं हैं। आमतौर पर एक सहसंबंध आईडी (UserId) होता है जो विभिन्न डोमेन द्वारा साझा किया जाता है।

यदि आपके सिस्टम में मैसेजिंग का उपयोग करना है, तो एक विकल्प सीक्यूआरएस के बिना उपयोगकर्ताओं को पंजीकृत और प्रबंधित करना है, फिर एक कमांड (रजिस्टर यूज़र {UserId}) भेजें। यह एक उपयोगकर्ता उपयोगकर्ता पंजीकृत प्रकाशित करेगा। अन्य डोमेन इस घटना को किसी भी वर्कफ़्लो या एआरएस को किक-ऑफ करने के लिए सुन सकते हैं।

+2

+1 मैं दूसरा .. यह सब नहीं सीक्यूआरएस या कुछ नहीं .. चुनें और चुनें कि यह कहां समझ में आता है। हमारे लिए, हम उपयोगकर्ता को प्रमाणित करते हैं और एक टोकन जारी करते हैं, जिसे हम प्रत्येक आदेश के शीर्षलेख को असाइन कर सकते हैं ताकि यह सुनिश्चित किया जा सके कि उपयोगकर्ता के पास सही पहुंच स्तर और क्रेडेंशियल्स कमांड के संदर्भ में कुछ संचालन करने के लिए हैं। – Sarmaad

+2

धन्यवाद! मुझे लगता है कि यह वास्तव में वह उत्तर है जिसे मैं ढूंढ रहा हूं। मैं इस समाधान के बारे में सोच रहा था, लेकिन ऐसा लगता है कि घटना स्टोर में कुछ डेटा और डीबी-टेबल में कुछ डेटा है। मैं राज्य को बहाल करने के लिए घटना को फिर से चलाने की क्षमता के बारे में भी चिंतित हूं, क्योंकि EventSouring का यह लाभ एकमात्र कारण है कि मैं इसका अन्वेषण कर रहा हूं। यह भी मुझे चिंतित करता है कि इस तरह के दो आर्किटेक्चर होने के कुछ संज्ञानात्मक उपर हैं। – tuxbear

0

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

लोग केवल स्केलिंग के उद्देश्य के लिए डिमॉर्मलाइज्ड ऑथ टेबल बनाते हैं और केवल तभी जब आपका ऑथ पढ़ा जाता है तो एक प्रदर्शन बाधा है। यदि नहीं - सामान्य 3 सामान्य रूप जाने का एक तरीका है।

SimpleMembership परिदृश्य में SimpleMembership द्वारा बनाई गई सभी तालिकाओं को "उपयोगकर्ता" कुल स्नैपशॉट के रूप में देखा जा सकता है। और हाँ, वे आपके ईवेंट स्टोर में कुछ डेटा डुप्लिकेट करेंगे। आपके पास ऐसी घटनाएं हो सकती हैं जैसे: UserCreated, UserUpdated, UserAssignedToRole, आदि

और उस सदस्यता प्रदाता के नाम से धोखा नहीं है। यह इतना आसान नहीं है और आमतौर पर ऐसी कई चीजें हैं जिनके बिना आप आसानी से रह सकते हैं (आपके डोमेन पर निर्भर करता है)। तो, हो सकता है कि आप इस तरह कुछ उपयोग कर सकें: https://gist.github.com/Kayli/fe73769f19fdff40c3a7

9

हमारे एमवीसी सीक्यूआरएस ऐप के लिए, हमने मूल रूप से डोमेन में सभी उपयोगकर्ता से संबंधित जानकारी रखने से शुरुआत की, और, जैसा कि किसी ने उल्लेख किया है, वहां एक रजिस्टर यूज़र कमांड और उपयोगकर्ता रजिस्ट्रार इवेंट था। डोमेन में उपयोगकर्ता की जानकारी संग्रहीत करने के बाद, वह ईवेंट प्रकाशित हो गया और पढ़ने के पक्ष में उठाया गया, जिसने एक उपयोगकर्ता भी बनाया और सभी पासवर्ड हैंश इत्यादि उत्पन्न किए। हमने फिर पढ़ने के पक्ष में प्रमाणीकरण किया: नियंत्रक एक के खिलाफ प्रमाणीकृत करने के लिए 'पढ़ें मॉडल प्रमाणीकरण सेवा' पर कॉल करें।

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

हम एक अलग डेटाबेस है कि हम नहीं बल्कि डोमेन या पढ़ा मॉडल से संबंधित की तुलना में एक केंद्रीय घटक के और अधिक हो सकता है, माना जाता है में उपयोगकर्ता सुरक्षा सामान डाल का फैसला किया। हम अभी भी उपयोगकर्ता प्रोफ़ाइल डोमेन से संबंधित जानकारी को बनाए रखने और पढ़ने के लिए मॉडल (जैसे कार्य शीर्षक, ट्विटर खाते यूआरएल आदि), लेकिन सभी सुरक्षा से संबंधित सामान, पासवर्ड हैश की तरह, यह केंद्रीय डेटाबेस में जमा हो जाती है। यह तब एक सेवा के साथ सुलभ है, जो एमवीसी और कमांड लेखक दोनों के लिए उपलब्ध है।

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

अंत में, आप निश्चित रूप से इस केंद्रीय घटक के लिए सदस्यता प्रदाताओं इस्तेमाल कर सकते हैं, लेकिन वहाँ उस के साथ pitfalls हो सकता है। हमने अपना खुद का लेखन समाप्त कर दिया - यह करना बहुत आसान है। यह आलेख this से लिंक करता है, जो इसे कार्यान्वित करने का एक अच्छा उदाहरण प्रदान करता है।

+0

धन्यवाद! मैं इन पथों का उपयोग करके वास्तविक अनुभव वाले लोगों से कुछ सलाह प्राप्त करने के लिए भी इस मार्ग को नीचे चला गया होगा। ES साथ पर मेरे बड़े बारी पुरानी जानकारी के साथ नई सुविधाओं का निर्माण करने की क्षमता है। डोमेन डेटा का भंडारण है क्योंकि घटनाएं आपके लिए मूल्यवान साबित हुई हैं? – tuxbear

+1

हाँ, क्योंकि इसका मतलब है कि आप ES को फिर से चलाकर सुरक्षा सामग्री को पुन: उत्पन्न कर सकते हैं। – jacderida

+0

आप जो भी वर्णन करते हैं वह आपके डोमेन ईवेंट को संभालने के लिए बस एक और [प्रक्षेपण] (http://abdullin.com/event-sourcing/projections.html) का उपयोग कर रहा है। यह वास्तव में बहुत आसान है, धन्यवाद! तो रीयलटाइम या स्टाइल डेटा का उपयोग केवल उस पर निर्भर करता है जब आप अपने पठन मॉडल को अपने ईवेंट के साथ सिंक्रनाइज़ करते हैं, और कुछ नहीं ... – inf3rno

संबंधित मुद्दे