Role-Based Access Control (RBAC)

KoaJS এর Authentication এবং Authorization - কোআজেএস (KoaJS) - Web Development

226

Role-Based Access Control (RBAC) একটি নিরাপত্তা মডেল যা ব্যবহারকারীদের নির্দিষ্ট ভূমিকার ভিত্তিতে অনুমতি দেয়। এই মডেলটি অ্যাপ্লিকেশনে বিভিন্ন ইউজার গ্রুপের জন্য বিভিন্ন ধরনের অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। KoaJS-এ RBAC ইমপ্লিমেন্ট করা সম্ভব এবং এটি নিরাপত্তা সংক্রান্ত বিভিন্ন কাজ যেমন অথেন্টিকেশন এবং অথরাইজেশনে সহায়তা করে।

RBAC এর মূল ধারণা হলো:

  • Roles: বিভিন্ন ধরনের রোল তৈরি করা হয়, যেমন Admin, User, Moderator ইত্যাদি।
  • Permissions: প্রতিটি রোলের জন্য বিভিন্ন অনুমতি (access) নির্ধারণ করা হয়, যেমন ডেটা দেখা, সম্পাদনা করা বা মুছে ফেলা।
  • Users: ব্যবহারকারীকে একটি নির্দিষ্ট রোল দিয়ে গ্রুপ করা হয় এবং সেই রোলের উপর ভিত্তি করে তাদের অনুমতি দেওয়া হয়।

এখানে, আমরা KoaJS-এ RBAC সেটআপ এবং কনফিগারেশন করার জন্য একটি উদাহরণ দেখব।


১. RBAC কনসেপ্ট ইমপ্লিমেন্টেশন

১.১. Role-Based Access Control কিভাবে কাজ করে?

ধরি, আমাদের একটি অ্যাপ্লিকেশন রয়েছে যেখানে Admin রোল সম্পূর্ণ অ্যাক্সেস পায়, User রোল শুধুমাত্র নিজের তথ্য দেখতে পারে এবং Moderator কিছু কনটেন্ট মডারেট করতে পারে। এর জন্য আমাদের কনফিগারেশন দরকার হবে:

  • Admin: সমস্ত রিসোর্স অ্যাক্সেস করতে পারে (View, Edit, Delete)।
  • User: শুধুমাত্র নিজেদের তথ্য দেখতে পারে।
  • Moderator: নির্দিষ্ট কনটেন্ট মডারেট করতে পারে (View, Delete কিন্তু Edit নয়)।

১.২. প্রাথমিক সেটআপ:

KoaJS-এ RBAC সেটআপ করতে প্রথমে koa-router এবং koa-jwt (JWT অথেনটিকেশন ব্যবহারের জন্য) ইনস্টল করতে হবে।

npm install koa-router koa-jwt jsonwebtoken

১.৩. RBAC এর জন্য কাস্টম মিডলওয়্যার তৈরি করা

আমরা প্রথমে একটি মিডলওয়্যার তৈরি করব যা ব্যবহারকারীর রোলের ভিত্তিতে রিকোয়েস্ট পরিচালনা করবে।

const Koa = require('koa');
const Router = require('koa-router');
const jwt = require('koa-jwt');
const jsonwebtoken = require('jsonwebtoken');
const app = new Koa();
const router = new Router();

// RBAC রোলসের একটি উদাহরণ
const roles = {
  admin: ['view', 'edit', 'delete'],
  user: ['view'],
  moderator: ['view', 'delete'],
};

// কাস্টম মিডলওয়্যার: Role-Based Access Control (RBAC)
const checkPermission = (requiredRole) => {
  return async (ctx, next) => {
    const user = ctx.state.user;  // JWT থেকে ইউজার ইনফরমেশন পেতে
    if (!user || !roles[user.role] || !roles[user.role].includes(requiredRole)) {
      ctx.status = 403;
      ctx.body = { message: 'Forbidden: You do not have permission to access this resource' };
      return;
    }
    await next();
  };
};

// JWT অথেনটিকেশন
app.use(jwt({ secret: 'your_secret_key' }).unless({ path: [/^\/login/] }));

// ডেমো রাউট
router.get('/admin', checkPermission('edit'), (ctx) => {
  ctx.body = 'Admin Access Granted';
});

router.get('/user', checkPermission('view'), (ctx) => {
  ctx.body = 'User Access Granted';
});

router.get('/moderator', checkPermission('delete'), (ctx) => {
  ctx.body = 'Moderator Access Granted';
});

// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());

// JWT Login Endpoint (অথেনটিকেশন)
router.post('/login', async (ctx) => {
  const { username, password } = ctx.request.body;

  // সঠিক ইউজার ভ্যালিডেশন চেক (এটি কেবল একটি উদাহরণ)
  if (username === 'admin' && password === 'admin') {
    const token = jsonwebtoken.sign({ username, role: 'admin' }, 'your_secret_key', { expiresIn: '1h' });
    ctx.body = { message: 'Login successful', token };
  } else if (username === 'user' && password === 'user') {
    const token = jsonwebtoken.sign({ username, role: 'user' }, 'your_secret_key', { expiresIn: '1h' });
    ctx.body = { message: 'Login successful', token };
  } else if (username === 'moderator' && password === 'moderator') {
    const token = jsonwebtoken.sign({ username, role: 'moderator' }, 'your_secret_key', { expiresIn: '1h' });
    ctx.body = { message: 'Login successful', token };
  } else {
    ctx.status = 401;
    ctx.body = { message: 'Invalid credentials' };
  }
});

// অ্যাপ চালু করা
app.listen(3000, () => {
  console.log('Server running on http://localhost:3000');
});

১.৪. JWT Token তৈরি এবং রিকোয়েস্টে পাঠানো

যখন ইউজার লগ ইন করে, তখন তার রোল অনুযায়ী একটি JWT টোকেন তৈরি করা হয়, যা রিকোয়েস্টের সাথে সার্ভারে পাঠানো হয়।

Login Request Example:

POST http://localhost:3000/login
{
  "username": "admin",
  "password": "admin"
}

যদি সঠিক ক্রেডেনশিয়াল দেওয়া হয়, তাহলে একটি JWT টোকেন তৈরি হবে যা পরবর্তী রিকোয়েস্টের সাথে পাঠানো যাবে। এরপর, RBAC কাস্টম মিডলওয়্যারটি ইউজারের রোল চেক করবে এবং নির্দিষ্ট অনুমতি প্রদান করবে।

১.৫. Role-Based Access Check

নির্দিষ্ট রোলের জন্য permission চেক করতে checkPermission() মিডলওয়্যার ব্যবহার করা হয়েছে। এই মিডলওয়্যার ব্যবহার করে আপনি একটি রিকোয়েস্টের ক্ষেত্রে রোল ভিত্তিক অনুমতি দিতে পারেন, যেমন admin এর জন্য "edit", user এর জন্য "view"।

২. আরও নিরাপত্তা ও অ্যাক্সেস কনট্রোল

RBAC-এর মাধ্যমে আপনি কেবল ইউজারদের বিভিন্ন রোল প্রদানই করবেন না, বরং তাদের অ্যাক্সেস নিয়ন্ত্রণ করবেন এবং অনুমতিগুলি কাস্টমাইজ করতে পারবেন। যেমন:

  • আপনি route-level নিরাপত্তা নির্ধারণ করতে পারেন।
  • নির্দিষ্ট HTTP methods যেমন POST, GET, DELETE, ইত্যাদি সংরক্ষণ করতে পারেন।

সারাংশ

KoaJS-এ Role-Based Access Control (RBAC) ইমপ্লিমেন্টেশন খুবই সহজ। এটি আপনাকে অ্যাপ্লিকেশনের বিভিন্ন অংশের জন্য নিরাপত্তা প্রদান করতে সাহায্য করে, যেখানে আপনি ইউজারের রোলের উপর ভিত্তি করে তাদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন। JWT ব্যবহার করে আপনি নিরাপদভাবে ইউজারের রোল যাচাই করে নির্দিষ্ট রিসোর্স অ্যাক্সেস করতে পারবেন। KoaJS-এ RBAC সিস্টেম সেটআপ করার মাধ্যমে আপনি অ্যাপ্লিকেশনে শক্তিশালী নিরাপত্তা প্রদান করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...