একটি এক্সপ্রেস মিডলওয়্যার তৈরি করছে যা পরামিতিগুলি গ্রহণ করে


105

আমি একটি মিডওয়্যার তৈরি করার চেষ্টা করছি যা পরামিতিগুলি গ্রহণ করতে পারে। কিভাবে এই কাজ করা যেতে পারে?

উদাহরণ

app.get('/hasToBeAdmin', HasRole('Admin'), function(req,res){

})

HasRole = function(role, req, res, next){
   if(role != user.role){
      res.redirect('/NotInRole);
   }

   next();
}

41
হা, আপনি আমার সঠিক দৃশ্যের জন্য আমার সঠিক প্রশ্নটি জিজ্ঞাসা করেছেন, তবে 6 বছর আগে। তাই দুর্দান্ত।
এয়ারো

6
@ হেরো ঠিক একই জিনিসটি আমি খুঁজছিলাম: ডি
জেসন ডায়াস

4
@ ইয়েরো 7 বছর পরে আমি একই ঠিক খুঁজছি: ডি
জিন ডি'আরমে

4
@ ero+ বছর পরে আমি ঠিক একই জিনিসটি খুঁজছি!
সিড

4
@aero 8 ~ বছর পরে আমি ঠিক একই জিনিসটি খুঁজছি! \ ও /
Íতালো সওসা

উত্তর:


162
function HasRole(role) {
  return function(req, res, next) {
    if (role !== req.user.role) res.redirect(...);
    else next();
  }
}

আমি এটিও নিশ্চিত করতে চাই যে আমি একই ফাংশনের একাধিক অনুলিপি তৈরি করব না:

function HasRole(role) {
  return HasRole[role] || (HasRole[role] = function(req, res, next) {
    if (role !== req.user.role) res.redirect(...);
    else next();
  })
}

9
দ্বিতীয় পদ্ধতিটি প্যারামিটারগুলিকে ক্যাশে করে, যা বা পছন্দসই আচরণ হতে পারে না।
পিয়র-লুক জেনড্রেউ

4
@ জোনাথন ওং, আপনি দয়া করে ফাংশনের দ্বিতীয় সংজ্ঞাটি ব্যাখ্যা করতে পারেন। সেখানে কি হচ্ছে? আমি নীচের লাইনটি হাসরোল [ভূমিকা] ফেরত বুঝতে পারছি না || (হাসরোল [ভূমিকা] = ফাংশন (রেক, রেজ, পরবর্তী) {
রাফয় হাসান

4
@ জোনাথন ওং আপনি নোডটি জানেন না এমনদের জন্য আপনি কি দ্বিতীয় উদাহরণটি আরও কিছুটা ব্যাখ্যা করতে পারেন? (আমি সহ). আপনি কখন একই ফাংশনের একাধিক অনুলিপি পেতে পারেন এবং কখন এটি সমস্যার কারণ হতে পারে? ধন্যবাদ
ডেভ

ক্যাশে ছাড়াই app.get('/a', hasRole('admin'))এবং app.get('/b', hasRole('admin'))প্রত্যেকের জন্য একটি নতুন বন্ধকরণ তৈরি করবে hasRole। আপনার যদি সত্যই বড় অ্যাপ্লিকেশন না থাকে তবে এটি বাস্তবের দিক থেকে খুব বেশি গুরুত্বপূর্ণ নয়। আমি ডিফল্টভাবে এই মত কোড।
জোনাথন ওং

14
app.get('/hasToBeAdmin', (req, res, next) => {
  hasRole(req, res, next, 'admin');
}, (req,res) => { 
    // regular route 
});

const hasRole = (req, res, next, role) => {
   if(role != user.role){
      res.redirect('/NotInRole');
   }
   next();
};

ভাল এবং সহজ ধারণা। মিডলওয়্যার আসলেই একটি সাধারণ ফাংশন। এটিতে অন্য মানগুলি কেন পাস করবেন না। প্রথম ফাংশনে দয়া করে রেক, রেস এবং পরবর্তী অন্তর্ভুক্ত করুন।
Zevero

4
কোড প্রায়শই নিজের পক্ষে কথা বলার পরেও আপনার কোডটিতে কিছু ব্যাখ্যা যুক্ত করা ভাল। কেবল কোড-উত্তরগুলির প্রবণতা হিসাবে এটি পর্যালোচনা সারিতে আপ আপ হয়েছে।
উইল

এসওতে যাওয়ার আগে আমি সেই পদ্ধতির কথা ভাবছিলাম, তবে আমি ভেবেছিলাম "মেহ, অবশ্যই আরও ভাল উপায় আছে"। দেখার পরে আমি দেখতে পাচ্ছি যে এটি সত্যই সহজতম এবং কার্যকর উপায় most
ফ্যাসেল্ডেব

3

বিকল্পভাবে আপনার যদি খুব বেশি মামলা না হয় বা ভূমিকা যদি স্ট্রিং না হয়:

function HasRole(role) {
  return function (req, res, next) {
    if (role !== req.user.role) res.redirect(/* ... */);
    else next();
  }
}

var middlware_hasRoleAdmin = HasRole('admin'); // define router only once

app.get('/hasToBeAdmin', middlware_hasRoleAdmin, function (req, res) {

})

মার্জিত সমাধান
লিওস লিটারাক

2

আপনার যদি বিভিন্ন অনুমতি স্তরের থাকে তবে আপনি সেগুলিকে এভাবে গঠন করতে পারেন:

const LEVELS = Object.freeze({
  basic: 1,
  pro: 2,
  admin: 3
});

/**
 *  Check if user has the required permission level
 */
module.exports = (role) => {
  return (req, res, next) => {
    if (LEVELS[req.user.role] < LEVELS[role]) return res.status(401).end();
    return next();
  }
}

0

আমি এই সমাধানটি ব্যবহার করি। আমি বডি রেকটিতে একটি জব্লিউটি টোকন পেয়েছি এবং সেখান থেকে ভূমিকা সম্পর্কিত তথ্য পেয়েছি

//roleMiddleware.js

const checkRole = role => {
    
    return (req, res, next) => {
        if (req.role == role) {
            console.log(`${role} role granted`)
            next()
        } else {
            res.status(401).send({ result: 'error', message: `No ${role} permission granted` })
        }
    }
}

module.exports = { checkRole }

সুতরাং প্রথমে আমি বৈধ ব্যবহারকারী কিনা তা জানার জন্য প্রমাণীকরণ মিডলওয়্যার ব্যবহার করি এবং তারপরে ভূমিকাটির মিডওয়্যারটি যদি এপিআই রুটে অ্যাক্সেস পায় কিনা তা জানার জন্য

// router.js

router.post('/v1/something-protected', requireAuth, checkRole('commercial'), (req, res) => {
    // do what you want...
})

আমি আশা করি দরকারী হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.