2016-09-28 8 views
7

वर्तमान में मीन स्टैक सीख रहा है, एक साधारण TODO के ऐप को विकसित करना और इसके लिए रोल आधारित एक्सेस कंट्रोल (आरबीएसी) लागू करना चाहता हूं। मैं MongoDB पर & अनुमति की भूमिका कैसे स्थापित करूं?मोंगो डीबी + नोड जेएस + रोल आधारित एक्सेस कंट्रोल (आरबीएसी)

मैं 3 भूमिकाओं (भूमिकाओं अजीब लग सकता है लेकिन यह विशुद्ध रूप से जानने के लिए है) हैं:

  • भगवान
  • सुपर हीरो
  • आदमी

भगवान - सुपर के समान व्यवस्थापक, आवेदन में कुछ भी कर सकते हैं। टीओडीओ के लिए और अन्य उपयोगकर्ताओं के लिए सी, आर, यू, डी अनुमतियां भी। एक TODO & बना सकते हैं इसे किसी भी सुपर हीरो या मैन को सीधे असाइन करें। किसी भी समय किसी भी समय TODO या उपयोगकर्ता को अद्यतन या हटाएं।

सुपर हीरो - व्यवस्थापक के समान, TODO के लिए अपने व्यक्तिगत डेटा - सी, आर, यू, डी पर कुछ भी करने की सुपर पावर है। कोई उपयोगकर्ता नहीं बना सकता केवल & पढ़ सकते हैं भगवान द्वारा बनाए गए TODO के लिए टिप्पणियां & उसे सौंपा गया है।

MAN - केवल उसे पढ़ने और TODO को टिप्पणियां जोड़ सकते हैं।

यह निष्कर्ष निकालने के लिए ऊपर:

GOD - C,R,U,D [Global Level] SUPER HERO - C,R,U,D [Private] + R,U [Assigned to him] MAN - R,U [Assigned to him]

मैं समझता हूँ कि मैं उपयोगकर्ताओं & भूमिका संग्रह की आवश्यकता है। जहां ROLES inturn के पास अनुमतियां होनी चाहिए आदि। मैं उन्हें कैसे तार दूं? उपयोगकर्ताओं दस्तावेज़ निम्नलिखित होगा:

उत्तर

5

मैं भूमिकाओं के लिए दिए गए नाम पसंद है।

जैसा कि आप MEAN स्टैक का उपयोग कर रहे हैं और अधिकतर मार्ग सत्यापन node पर होता है, मैं रोल टेबल को सरल रखना पसंद करूंगा।

भूमिका:

{ 
_id : 1, 
name : GOD, 
golbalPerms : true 
}, 
{ 
_id : 2, 
name : SUPER HERO, 
privatePerms : true 
}, 
{ 
_id : 3, 
name : MAN 
} 

उपयोगकर्ता:

{ 
_id : 111, 
name : Jesus, 
roleId : 1 
}, 
{ 
_id : 222, 
name : BatMan, 
roleId : 2 
}, 
{ 
_id : 333, 
name : Jack, 
roleId : 3 
} 

जब में और user वस्तु वापस ग्राहक को भेजने से उपयोगकर्ता के लॉग, डीबी से role वस्तु इसी के साथ roleId बदलना सुनिश्चित करें।

नोड जे एस पर कोड के लिए आ रहा है:

पूरी तरह से अपने USECASE को समझ कर हम उन्हें निम्न विधियों में विभाजित कर सकते हैं -

  • CreateUser

  • CreateTodo

  • DeleteTodo

  • ReadTodo

  • UpdateTodo
  • CommentTodo

  • AssignTodo

चरण दर चरण, CreateUser आओ चलें।

मार्गों कोड स्निपेट:

app.all('/users', users.requiresLogin); 

// Users Routes 
app.route('/users') 
    .post(users.hasPerms('globalPerms'), users.create); 

अपने नियंत्रक में आप, इनपुट globalPerms के आधार पर मान्य कर सकते हैं यदि मान्य बाकी next()return बुला त्रुटि संदेश इसी के साथ द्वारा उपयोगकर्ता बनाने के लिए अनुमति देते हैं।

अब CreateTodo & & DeleteTodo:

उनमें से

दोनों एक छोटे चाल के साथ एक ही तर्क पर काफी काम करते हैं।

मार्गों कोड स्निपेट:

app.all('/todos', users.requiresLogin); 

// Users Routes 
app.route('/todos') 
    .post(users.hasPerms('globalPerms','privatePerms'), todos.create); 
    .delete(users.hasPerms('globalPerms','privatePerms'), todos.delete); 

एक तोदो बनाने के लिए, globalPermsभगवान & privatePerms साथ हैं सुपर हीरो साथ कर रहे हैं, उन दोनों को अनुमति दी जा सकती।

ट्रिक यहां todos.delete विधि में होगा, बस user.id === todos.createById सुनिश्चित करें कि सुपर हीरो भगवान द्वारा बनाए गए टोडोस को हटाने के लिए आगे बढ़ सकता है।

ReadTodo:

एक TODO यह एक createById वैसे ही संग्रहीत की जाने वाली एक TODO तो assignedTo किसी को सौंपा गया है और assignedBy भी दर्ज किया जाना चाहिए होना चाहिए बना दिया जाता है।

इससे कई अन्य परिचालनों को संभालने में आसान बनाता है।

user.role.globalPerms - भगवान को सभी TODO का डेटा दें।

user.role.privatePerms - TODO को या तो बनाया गया है उसे दिया गया है या उसे सौंपा गया है।

user.role.globalPerms === undefined && user.role.privatePerms === undefined - इसके मैन और TODO को जो केवल उन्हें सौंपा गया है।

UpdateTodo & CommentTodo:

सरल एक, loggedInUser.id === todos.createdById तो वह उसे किसी को भी प्रदान कर सकते हैं:

यह वही है ReadTODO तो DIY करता

अंतिम एक, AssignTodo की सटीक प्रतिकृति है ।

दो बातें ध्यान में रखने के लिए यहाँ:

  1. बताए हिस्सा ज्यादातर अपने यूआई पर होता है (कोणीय) सामने, मैं loggedInUser.id === todos.createdById जाँच की है कि दृष्टिकोण दिया है। किसी भी तरीके से लॉग इन ऑपरेशन द्वारा सभी TODO को देखे जाने वाले किसी भी तरीके से लॉग इन किया जा सकता है और इसे किसी भी व्यक्ति को असाइन कर सकता है।

  2. सुनिश्चित करें कि सुपर हीरो केवल खुद को या अन्य सुपर हीरो या एक आदमी को TODO असाइन कर सकता है लेकिन भगवान के लिए नहीं। यूआई फ्रंट पर विकल्पों को असाइन करने के तरीके को आप कैसे दिखाते हैं इस सवाल के दायरे से बाहर है। यह सिर्फ एक सिर ऊपर है।

आशा यह स्पष्ट किया गया था।

नोट: रोल संग्रह में MAN को अनुमति देने की कोई आवश्यकता नहीं थी & हमने सभी संभावित संचालनों को प्रबंधित किया।

+0

यह साफ-सुथरा संभव समाधान था जिसे मैं किसी भी तृतीय पक्ष मॉड्यूल का उपयोग करके बाहर निकलने के लिए कह सकता था। धन्यवाद :) – BeingSuman

0

संभव approach-> भूमिका उपयोगकर्ता संग्रह/स्कीमा में एम्बेडेड है

{ 
    _id : "[email protected]", 
    name: "lorem ipsum", 
    role: "MAN" 
} 

जहां तक ​​अपने पद का वर्णन करता है, केवल भगवान बनाने के लिए और Todos असाइन कर सकते हैं। भूमिकाओं संग्रह निम्नलिखित पकड़ सकता है:

{ 
    _id : "MAN", 
    globalPerm: [], 
    privatePerm: [], 
    assignedPerm: ["r","u"], 
}, 
{ 
    _id : "SUPER_HERO", 
    globalPerm: [], 
    privatePerm: ["c","r","u","d"], 
    assignedPerm: ["c","r","u","d"], 
}, 
{ 
    _id : "GOD", 
    globalPerm: ["c","r","u","d"], 
    privatePerm: ["c","r","u","d"], 
    assignedPerm: ["c","r","u","d"], 
} 

नोड जे एस Middlewares एक उपयोगकर्ता के लिए सही अनुमति मूल्यों मिलने के बाद, आप middlewares उपयोग करने के लिए चाहते हो सकता है। नमूना एक्सप्रेस HTTP अनुरोध मार्ग:

app.post('/updateTodo', permissions.check('privatePerm', 'c'), function (req, res) { 
// do stuff 

};

अनुमतियां। चेक को वास्तव में TODO को अपडेट करने के लिए फ़ंक्शन बॉडी निष्पादित करने से पहले कहा जाता है।

इसलिए यदि कोई उपयोगकर्ता टोडो को अपडेट करने का प्रयास करता है, तो यह पहले संबंधित अनुमतियों को सत्यापित करेगा।

0

यह एक बहुत व्यापक प्रश्न है जिसे कई तरीकों से हल किया जा सकता है।

आपने कहा है कि आप MEAN स्टैक का उपयोग कर रहे हैं इसलिए मैं अपना प्रश्न उस पर सीमित कर दूंगा।

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

हमारे पास 3 प्रकार के उपयोगकर्ता हैं। आपके पास टोकन के प्रकार के बीच अंतर करने के लिए अलग-अलग विकल्प उपलब्ध हैं।

  1. अलग संग्रह (MongoDB) या Redis सेट जहां वे संग्रहीत किया जाएगा
  2. एन्क्रिप्टेड निशानी के रूप में अच्छी तरह से आदि उपयोगकर्ता के प्रकार होगा .. (यह उस समय उपयोगी आ जाएगा अगर आप की जरूरत नहीं है बैकएंड पर स्टोर टोकन, आप बस डिक्रिप्ट कर सकते हैं और जांच सकते हैं)

    • यह पूरी तरह से उपयोग के मामले पर निर्भर करेगा।

अब, उपयोगकर्ता विशिष्ट मार्ग के लिए किसी भी उपयोगकर्ता की प्रविष्टि की अनुमति देता है सुनिश्चित करें कि आप टोकन पहले जाँच कर रहे हैं बनाने से पहले।

उदाहरण

app.post('/godlevelroute', godtokencheck, callrouteandfunction); 
app.post('/superherolevelroute', superheroroute, callrouteandfunction); 

आप कोणीय से शीर्षक में टोकन भेजना होगा और फिर आप हैडर से बाहर डेटा ले जा सकते हैं और फिर आप देख सकते हैं कि उस विशिष्ट उपयोगकर्ता उस मार्ग या नहीं के माध्यम से जाने की अनुमति है।

मान लें कि एक ईश्वर स्तर का उपयोगकर्ता लॉग इन है तो उसके पास भगवान के साथ ईश्वरीय बात होगी और हम उसे उस मार्ग तक पहुंचने से पहले उसे जांच लेंगे या फिर आप केवल त्रुटि संदेश दिखा सकते हैं।

इस सर्वर अंत पर अपने नमूना टोकन चेकिंग समारोह हो सकता है

function checkToken(req, res, next) { 
var token = req.headers['accesstoken']; //access token from header 
//now depending upon which system you are following you can run a check 
}; 

नोड मॉड्यूल सुझाव: https://www.npmjs.com/package/jsonwebtoken

अब हिस्सा दृश्यपटल आ रहा है। आप जो लिखा है उसके आधार पर आप कोणीय का उपयोग कर रहे हैं, आप किसी भी पेज को दिखाने से पहले टोकन को रोक सकते हैं।

आप इस ब्लॉग के माध्यम से व्याख्या करने की कोशिश कर रहे चित्रों का एक चित्रमय प्रतिनिधित्व प्राप्त करने के लिए जा सकते हैं। , सुपर हीरो & आदमी, आसान समझने के लिए भगवान - Click Here

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