पता लगाएं कि इन प्रौद्योगिकियों को व्यावहारिक प्रदर्शन के साथ कैसे संयोजित किया जाए।

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

इस प्रकार का प्रमाणीकरण सिस्टम प्रशासकों को उपयोगकर्ताओं की निर्दिष्ट भूमिकाओं के अनुसार अनुमतियाँ नियंत्रित करने में मदद करता है। विस्तृत नियंत्रण का यह स्तर सुरक्षा की एक परत जोड़ता है, जिससे ऐप्स को अनधिकृत पहुंच को रोकने की अनुमति मिलती है।

Passport.js और JWTs का उपयोग करके भूमिका-आधारित पहुंच नियंत्रण तंत्र लागू करना

भूमिका-आधारित अभिगम नियंत्रण (आरबीएसी) एक लोकप्रिय तंत्र है जिसका उपयोग उपयोगकर्ता भूमिकाओं और अनुमतियों के आधार पर अनुप्रयोगों में पहुंच प्रतिबंध लागू करने के लिए किया जाता है। आरबीएसी तंत्र को लागू करने के लिए विभिन्न विधियाँ उपलब्ध हैं।

दो लोकप्रिय दृष्टिकोणों में समर्पित आरबीएसी पुस्तकालयों का उपयोग करना शामिल है एक्सेसकंट्रोल या तंत्र को लागू करने के लिए मौजूदा प्रमाणीकरण पुस्तकालयों का लाभ उठाना।

इस मामले में, JSON वेब टोकन (JWTs) प्रमाणीकरण क्रेडेंशियल प्रसारित करने का एक सुरक्षित तरीका प्रदान करते हैं, जबकि Passport.js लचीला प्रमाणीकरण प्रदान करके प्रमाणीकरण प्रक्रिया को सरल बनाता है मध्यस्थ।

इस दृष्टिकोण का उपयोग करके, आप उपयोगकर्ताओं को भूमिकाएँ सौंप सकते हैं और प्रमाणित होने पर उन्हें JWT में एन्कोड कर सकते हैं। फिर आप बाद के अनुरोधों में उपयोगकर्ता की पहचान और भूमिकाओं को सत्यापित करने के लिए JWT का उपयोग कर सकते हैं, जिससे भूमिका-आधारित प्राधिकरण और पहुंच नियंत्रण की अनुमति मिलती है।

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

आप इस प्रोजेक्ट का कोड यहां से डाउनलोड कर सकते हैं गिटहब रिपॉजिटरी.

एक Express.js प्रोजेक्ट सेट करें

प्रारंभ करना, स्थानीय स्तर पर एक Express.js प्रोजेक्ट स्थापित करें. एक बार जब आप प्रोजेक्ट सेट कर लें, तो आगे बढ़ें और इन पैकेजों को इंस्टॉल करें:

एनपीएम इंस्टॉल कॉर्स डोटेनवी नेवला कुकी-पार्सर जेसनवेबटोकन मोंगोडब \
पासपोर्ट पासपोर्ट-स्थानीय

अगला, एक MongoDB डेटाबेस बनाएं या MongoDB एटलस पर एक क्लस्टर स्थापित करें. डेटाबेस कनेक्शन यूआरआई की प्रतिलिपि बनाएँ और इसे एक में जोड़ें .env अपने प्रोजेक्ट की रूट डायरेक्टरी में फ़ाइल करें:

CONNECTION_URI='कनेक्शन URI'

डेटाबेस कनेक्शन कॉन्फ़िगर करें

रूट डायरेक्टरी में, एक नया बनाएं यूटिल्स/डीबी.जेएस फ़ाइल बनाएं, और Mongoose का उपयोग करके एटलस पर चल रहे MongoDB क्लस्टर से कनेक्शन स्थापित करने के लिए नीचे दिया गया कोड जोड़ें।

कॉन्स्ट नेवला = ज़रूरत होना('नेवला');

कॉन्स्ट कनेक्टडीबी = async () => {
कोशिश {
इंतजार mongoose.connect (process.env. CONNECTION_URI);
सांत्वना देना।लकड़ी का लट्ठा("MongoDB से जुड़ा!");
} पकड़ना (गलती) {
सांत्वना देना।गलती("MongoDB से कनेक्ट करने में त्रुटि:", गलती);
}
};

मापांक.निर्यात = कनेक्टडीबी;

डेटा मॉडल को परिभाषित करें

रूट डायरेक्टरी में, एक नया बनाएं मॉडल/उपयोगकर्ता.मॉडल.जेएस फ़ाइल बनाएं, और Mongoose का उपयोग करके उपयोगकर्ताओं के डेटा के लिए डेटा मॉडल को परिभाषित करने के लिए निम्नलिखित कोड जोड़ें।

कॉन्स्ट नेवला = ज़रूरत होना('नेवला');

कॉन्स्ट उपयोगकर्ता स्कीमा = नया नेवला. स्कीमा({
उपयोगकर्ता नाम: डोरी,
पासवर्ड: डोरी,
भूमिका: डोरी
});

मापांक.निर्यात = नेवला.मॉडल('उपयोगकर्ता', उपयोगकर्तास्कीमा);

एपीआई एंडपॉइंट के लिए नियंत्रक बनाएं

कोई नया बनाएं नियंत्रक/उपयोगकर्ता.नियंत्रक.जे.एस रूट डायरेक्टरी में फ़ाइल करें और नीचे कोड जोड़ें।

सबसे पहले, ये आयात करें:

कॉन्स्ट उपयोगकर्ता = ज़रूरत होना('../मॉडल/उपयोगकर्ता.मॉडल');
कॉन्स्ट पासपोर्ट = ज़रूरत होना('पासपोर्ट');
कॉन्स्ट {जनरेटटोकन} = ज़रूरत होना('../मिडलवेयर/ऑथ');
ज़रूरत होना('../मिडलवेयर/पासपोर्ट')(पासपोर्ट);

इसके बाद, उपयोगकर्ता पंजीकरण और लॉगिन कार्यक्षमता को प्रबंधित करने के लिए तर्क को परिभाषित करें:

निर्यात.रजिस्टर उपयोगकर्ता = async (req, res) => {
कॉन्स्ट { उपयोगकर्ता नाम, पासवर्ड, भूमिका } = req.body;

कोशिश {
इंतजार User.create({उपयोगकर्ता नाम, पासवर्ड, भूमिका });
पुनः स्थिति(201.json({ संदेश: 'उपयोगकर्ता सफलतापूर्वक पंजीकृत' });
} पकड़ना (गलती) {
सांत्वना देना.लॉग (त्रुटि);
पुनः स्थिति(500.json({ संदेश: 'एक त्रुटि पाई गई!' });
}
};

निर्यात.लॉगिन उपयोगकर्ता = (req, res, अगला) => {
पासपोर्ट.प्रमाणीकृत('स्थानीय', { सत्र: असत्य }, (त्रुटि, उपयोगकर्ता, जानकारी) => {
अगर (त्रुटि) {
सांत्वना देना.लॉग (त्रुटि);

वापस करना पुनः स्थिति(500.json({
संदेश: 'लॉग इन करते समय एक त्रुटि हुई'
});
}

अगर (! उपयोगकर्ता) {
वापस करना पुनः स्थिति(401.json({
संदेश: 'अमान्य प्रवेश करना प्रत्यायक'
});
}

req.लॉगिन (उपयोगकर्ता, { सत्र: असत्य }, (त्रुटि) => {
अगर (त्रुटि) {
सांत्वना देना.लॉग (त्रुटि);

वापस करना पुनः स्थिति(500.json({
संदेश: 'लॉग इन करते समय एक त्रुटि हुई'
});
}

कॉन्स्ट { _आईडी, उपयोगकर्ता नाम, भूमिका } = उपयोगकर्ता;
कॉन्स्ट पेलोड = { उपयोगकर्ता पहचान: _आईडी, उपयोगकर्ता नाम, भूमिका };
कॉन्स्ट टोकन = जेनरेटटोकन (पेलोड);
res.कुकी('टोकन', टोकन, { केवल Http: सत्य });
वापस करना पुनः स्थिति(200.json({ संदेश: 'लॉग इन सफल' });
});
})(req, res, अगला);
};

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

दूसरी ओर, लॉगिन उपयोगकर्ता फ़ंक्शन Passport.js द्वारा प्रदान की गई स्थानीय प्रमाणीकरण रणनीति का उपयोग करके उपयोगकर्ता लॉगिन की सुविधा प्रदान करता है। यह उपयोगकर्ता के क्रेडेंशियल्स को प्रमाणित करता है और सफल लॉगिन पर एक टोकन लौटाता है जिसे बाद में प्रमाणित अनुरोधों के लिए कुकी में संग्रहीत किया जाता है। यदि लॉगिन प्रक्रिया के दौरान कोई त्रुटि होती है, तो यह एक उचित संदेश लौटाएगा।

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

निर्यात.getUsers = async (req, res) => {
कोशिश {
कॉन्स्ट उपयोगकर्ता = इंतजार उपयोगकर्ता.खोज({});
res.json (उपयोगकर्ता);
} पकड़ना (गलती) {
सांत्वना देना.लॉग (त्रुटि);
पुनः स्थिति(500.json({ संदेश: 'एक त्रुटि पाई गई!' });
}
};

एक Passport.js स्थानीय प्रमाणीकरण रणनीति सेट करें

उपयोगकर्ताओं द्वारा अपने लॉगिन क्रेडेंशियल प्रदान करने के बाद उन्हें प्रमाणित करने के लिए, आपको एक स्थानीय प्रमाणीकरण रणनीति स्थापित करने की आवश्यकता है।

कोई नया बनाएं मिडलवेयर/पासपोर्ट.जेएस रूट डायरेक्टरी में फ़ाइल करें और निम्नलिखित कोड जोड़ें।

कॉन्स्ट स्थानीय रणनीति = ज़रूरत होना('पासपोर्ट-स्थानीय')।रणनीति;
कॉन्स्ट उपयोगकर्ता = ज़रूरत होना('../मॉडल/उपयोगकर्ता.मॉडल');

मापांक.निर्यात= (पासपोर्ट) => {
पासपोर्ट.उपयोग(
नया स्थानीय रणनीति(async (उपयोगकर्ता नाम, पासवर्ड, हो गया) => {
कोशिश {
कॉन्स्ट उपयोगकर्ता = इंतजार User.findOne({ उपयोगकर्ता नाम });

अगर (! उपयोगकर्ता) {
वापस करना पूर्ण(व्यर्थ, असत्य);
}

अगर (उपयोगकर्ता.पासवर्ड!== पासवर्ड) {
वापस करना पूर्ण(व्यर्थ, असत्य);
}

वापस करना पूर्ण(व्यर्थ, उपयोगकर्ता);
} पकड़ना (गलती) {
वापस करना हो गया (त्रुटि);
}
})
);
};

यह कोड उपयोगकर्ताओं को उनके प्रदान किए गए उपयोगकर्ता नाम और पासवर्ड के आधार पर प्रमाणित करने के लिए एक स्थानीय पासपोर्ट.जेएस रणनीति को परिभाषित करता है।

सबसे पहले, यह मेल खाने वाले उपयोगकर्ता नाम वाले उपयोगकर्ता को ढूंढने के लिए डेटाबेस से पूछताछ करता है और फिर उनके पासवर्ड को सत्यापित करने के लिए आगे बढ़ता है। नतीजतन, यदि लॉगिन प्रक्रिया सफल होती है तो यह प्रमाणित उपयोगकर्ता ऑब्जेक्ट लौटाता है।

एक JWT सत्यापन मिडलवेयर बनाएं

के अंदर मध्यस्थ निर्देशिका, एक नई auth.js फ़ाइल बनाएं, और JWTs उत्पन्न और सत्यापित करने वाले मिडलवेयर को परिभाषित करने के लिए निम्नलिखित कोड जोड़ें।

कॉन्स्ट जेडब्ल्यूटी = ज़रूरत होना('jsonwebtoken');
कॉन्स्ट SecretKey = प्रक्रिया.env. गुप्त_कुंजी;

कॉन्स्ट जनरेटटोकन = (पेलोड) => {
कॉन्स्ट टोकन = jwt.sign (पेलोड, सीक्रेटकी, { में समाप्त होना: '1 घंटा' });
वापस करना टोकन;
};

कॉन्स्ट सत्यापितटोकन = (आवश्यक भूमिका) =>(req, res, अगला) => {
कॉन्स्ट टोकन = req.cookies.टोकन;

अगर (!टोकन) {
वापस करना पुनः स्थिति(401.json({ संदेश: 'कोई टोकन नहीं दिया गया' });
}

jwt.verify (टोकन, सीक्रेटकी, (त्रुटि, डीकोडेड) => {
अगर (त्रुटि) {
वापस करना पुनः स्थिति(401.json({ संदेश: 'अमान्य टोकन' });
}

req.userId = डिकोडेड.userId;

अगर (डीकोडेड.भूमिका !== आवश्यकभूमिका) {
वापस करना पुनः स्थिति(403.json({
संदेश: 'आपके पास इस संसाधन तक पहुँचने के लिए प्राधिकरण और अनुमतियाँ नहीं हैं।'
});
}

अगला();
});
};

मापांक.exports = { generateToken, VerifyToken };

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

JWTs पर विशिष्ट रूप से हस्ताक्षर करने के लिए, आपको एक अद्वितीय गुप्त कुंजी उत्पन्न करनी होगी और उसे अपने साथ जोड़ना होगा .env फ़ाइल जैसा कि नीचे दिखाया गया है।

SECRET_KEY='यह एक नमूना गुप्त कुंजी है।'

एपीआई रूट्स को परिभाषित करें

रूट डायरेक्टरी में, एक नया फ़ोल्डर बनाएं और इसे रूट्स नाम दें। इस फ़ोल्डर के अंदर, एक नया बनाएं userRoutes.js, और निम्नलिखित कोड जोड़ें।

कॉन्स्ट एक्सप्रेस = ज़रूरत होना('अभिव्यक्त करना');
कॉन्स्ट राउटर = एक्सप्रेस. राउटर();
कॉन्स्ट उपयोगकर्ता नियंत्रक = ज़रूरत होना('../नियंत्रक/उपयोगकर्ता नियंत्रक');
कॉन्स्ट {verifyToken } = ज़रूरत होना('../मिडलवेयर/ऑथ');

राउटर.पोस्ट('/एपीआई/रजिस्टर', userControllers.registerUser);
राउटर.पोस्ट('/एपीआई/लॉगिन', userControllers.loginUser);

राउटर.गेट('/एपीआई/उपयोगकर्ता', सत्यापितटोकन('व्यवस्थापक'), userControllers.getUsers);

मापांक.निर्यात = राउटर;

यह कोड REST API के लिए HTTP मार्गों को परिभाषित करता है। उपयोगकर्ताओं रूट विशेष रूप से, सर्वर संरक्षित मार्ग के रूप में। के साथ उपयोगकर्ताओं तक पहुंच सीमित करके व्यवस्थापक भूमिका, आप भूमिका-आधारित अभिगम नियंत्रण को प्रभावी ढंग से लागू करते हैं।

मुख्य सर्वर फ़ाइल को अद्यतन करें

अपनी खोलो सर्वर.जे.एस फ़ाइल करें और इसे इस प्रकार अद्यतन करें:

कॉन्स्ट एक्सप्रेस = ज़रूरत होना('अभिव्यक्त करना');
कॉन्स्ट कॉर्स = ज़रूरत होना('कोर्स');
कॉन्स्ट कुकी पार्सर = ज़रूरत होना('कुकी-पार्सर');
कॉन्स्ट ऐप = एक्सप्रेस();
कॉन्स्ट पोर्ट = 5000;
ज़रूरत होना('dotenv'.config();
कॉन्स्ट कनेक्टडीबी = ज़रूरत होना('./utils/db');
कॉन्स्ट पासपोर्ट = ज़रूरत होना('पासपोर्ट');
ज़रूरत होना('./मिडलवेयर/पासपोर्ट')(पासपोर्ट);

कनेक्टडीबी();

ऐप.यूज़ (एक्सप्रेस.जेसन());
ऐप.यूज़ (express.urlencoded({ विस्तारित: सत्य }));
ऐप.यूज़ (cors());
ऐप.यूज़ (कुकीपार्सर());
ऐप.यूज़ (पासपोर्ट.इनिशियलाइज़());

कॉन्स्ट उपयोगकर्ता मार्ग = ज़रूरत होना('./रूट्स/यूजररूट्स');
ऐप.उपयोग('/', उपयोगकर्तारूट्स);

ऐप.सुनें (पोर्ट, () => {
सांत्वना देना।लकड़ी का लट्ठा(`सर्वर पोर्ट पर चल रहा है ${पोर्ट}`);
});

अंत में, एप्लिकेशन को चलाने के लिए डेवलपमेंट सर्वर प्रारंभ करें।

नोड सर्वर.जे.एस

अपने प्रमाणीकरण सिस्टम को उन्नत करने के लिए आरबीएसी तंत्र का लाभ उठाएं

भूमिका-आधारित अभिगम नियंत्रण लागू करना आपके एप्लिकेशन की सुरक्षा बढ़ाने का एक प्रभावी तरीका है।

एक कुशल आरबीएसी प्रणाली स्थापित करने के लिए मौजूदा प्रमाणीकरण पुस्तकालयों को शामिल करना एक बेहतरीन दृष्टिकोण है, लेकिन इसके लिए आरबीएसी पुस्तकालयों का लाभ उठाया जा सकता है। उपयोगकर्ता भूमिकाओं को स्पष्ट रूप से परिभाषित करना और अनुमतियाँ निर्दिष्ट करना और भी अधिक मजबूत समाधान प्रदान करता है, अंततः आपकी समग्र सुरक्षा को बढ़ाता है आवेदन पत्र।