GraphQL এর মধ্যে Role-Based Access Control (RBAC)

GraphQL এবং Authentication - গ্রাফকিউএল (GraphQL) - Web Development

381

গ্রাফকিউএল (GraphQL)-এ Role-Based Access Control (RBAC) ব্যবহারের মাধ্যমে আপনি ব্যবহারকারীদের বিভিন্ন রোলের ভিত্তিতে ডেটাতে অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। এটি একটি নিরাপত্তা কৌশল, যেখানে বিভিন্ন ধরনের ব্যবহারকারীকে বিভিন্ন রিসোর্সে অ্যাক্সেস করার অনুমতি দেওয়া হয়, তাদের রোল বা অবস্থান অনুসারে। RBAC ব্যবহার করার মাধ্যমে আপনি গ্রাফকিউএল API এর মাধ্যমে কোন ইউজার কী ধরনের ডেটা অ্যাক্সেস করতে পারবে তা নির্ধারণ করতে পারেন।

RBAC কি?

RBAC (Role-Based Access Control) হল একটি নিরাপত্তা পদ্ধতি যেখানে ব্যবহারকারীদের বিভিন্ন roles (রোল) এর মাধ্যমে অ্যাক্সেস নিয়ন্ত্রণ করা হয়। প্রতিটি রোলের সাথে কিছু নির্দিষ্ট অনুমতি (permissions) যুক্ত থাকে, যা নির্ধারণ করে কোন রিসোর্সে অ্যাক্সেস অনুমোদিত হবে এবং কোন রিসোর্সে না।

  • Roles (রোলস): গ্রাহকদের জন্য নির্ধারিত বিভিন্ন অবস্থান বা ভূমিকা যেমন অ্যাডমিন, ইউজার, ম্যানেজার ইত্যাদি।
  • Permissions (অনুমতি): নির্দিষ্ট রোলের জন্য অনুমোদিত ক্রিয়াকলাপ, যেমন ডেটা তৈরি করা, পড়া, আপডেট করা বা মুছে ফেলা।

GraphQL এবং RBAC

গ্রাফকিউএল-এ RBAC সাধারণত Authentication এবং Authorization এর মাধ্যমে কার্যকরীভাবে বাস্তবায়িত হয়। Authentication নিশ্চিত করে যে ব্যবহারকারী সঠিকভাবে সাইন ইন করেছে, এবং Authorization নিশ্চিত করে যে সে সেই নির্দিষ্ট রোলের অধীনে ডেটা অ্যাক্সেস করতে পারবে কি না।

GraphQL-এ RBAC বাস্তবায়ন

গ্রাফকিউএল-এ RBAC বাস্তবায়ন করতে হলে আপনাকে কিছু পদক্ষেপ নিতে হবে:

  1. ব্যবহারকারীর রোল সংজ্ঞায়িত করা।
  2. GraphQL কুয়েরি বা মিউটেশন রেজোলভারে রোল যাচাই করা।
  3. পজিটিভ বা নেগেটিভ রোল ভিত্তিক অনুমতি প্রদান করা।

Step-by-step: GraphQL-এ RBAC বাস্তবায়ন

ধরা যাক, আপনার অ্যাপ্লিকেশনে তিনটি রোল রয়েছে: Admin, User, এবং GuestAdmin রোলের ব্যবহারকারী সব ডেটায় অ্যাক্সেস পাবেন, User শুধুমাত্র তাদের নিজস্ব ডেটাতে অ্যাক্সেস পাবে, এবং Guest রোলের ব্যবহারকারী শুধুমাত্র পাবলিক ডেটা দেখতে পারবে।

১. Role-based User Authentication

প্রথমে, ব্যবহারকারীর JWT (JSON Web Token) বা অন্য কোনো টোকেনের মাধ্যমে তাদের রোল শনাক্ত করা হয়। সাধারণত, JWT-তে রোল সম্পর্কিত তথ্য রাখা হয়।

// JWT তৈরি করার সময় রোল অন্তর্ভুক্ত করা
const jwt = require('jsonwebtoken');

function generateToken(user) {
  return jwt.sign(
    { id: user.id, role: user.role },  // ইউজারের রোলও টোকেনে অন্তর্ভুক্ত করা হচ্ছে
    'your_secret_key',
    { expiresIn: '1h' }
  );
}

২. GraphQL কুয়েরি এবং মিউটেশন স্কিমা তৈরি

গ্রাফকিউএল স্কিমাতে আমরা ইউজারের জন্য কিছু কুয়েরি এবং মিউটেশন যুক্ত করব।

type Query {
  getUserData: User
  getPublicData: [Data]
}

type Mutation {
  createUserData(data: String!): UserData
  updateUserData(id: ID!, data: String!): UserData
}

type User {
  id: ID!
  name: String!
  email: String!
}

type UserData {
  id: ID!
  userId: ID!
  data: String!
}

type Data {
  id: ID!
  content: String!
}

এখানে, আমরা তিনটি রিসোর্স তৈরি করেছি:

  1. getUserData: ইউজারের ব্যক্তিগত ডেটা (এটি শুধু Admin এবং User রোলের জন্য অনুমোদিত)।
  2. getPublicData: পাবলিক ডেটা (এটি Guest রোলের জন্য অনুমোদিত)।
  3. createUserData এবং updateUserData: ডেটা তৈরি এবং আপডেট করার মিউটেশন (এটি Admin এবং User রোলের জন্য অনুমোদিত)।

৩. Authorization রেজোলভার তৈরি

এখন, RBAC বাস্তবায়ন করতে, আমাদের গ্রাফকিউএল রেজোলভারের মধ্যে রোল যাচাই করতে হবে।

const resolvers = {
  Query: {
    getUserData: async (_, __, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // ইউজারের ডেটা রিটার্ন করুন
      return await UserData.findOne({ where: { userId: context.user.id } });
    },
    getPublicData: async () => {
      // সকল পাবলিক ডেটা ফেরত দিন
      return await PublicData.findAll();
    }
  },
  Mutation: {
    createUserData: async (_, { data }, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // নতুন ডেটা তৈরি করুন
      return await UserData.create({ userId: context.user.id, data });
    },
    updateUserData: async (_, { id, data }, context) => {
      if (context.user.role !== 'Admin' && context.user.role !== 'User') {
        throw new Error('Unauthorized');
      }
      // ইউজারের ডেটা আপডেট করুন
      return await UserData.update({ data }, { where: { id, userId: context.user.id } });
    }
  }
};

৪. Context এ User রোল সংরক্ষণ করা

গ্রাফকিউএল সার্ভারে, Apollo Server অথবা অন্য সার্ভারে context সেট করতে হবে যাতে ব্যবহারকারীকে যাচাই করা যায়।

const { ApolloServer, gql } = require('apollo-server');
const jwt = require('jsonwebtoken');

const typeDefs = gql`
  # Schema definition here...
`;

const resolvers = {
  //Resolvers as shown above
};

const server = new ApolloServer({
  typeDefs,
  resolvers,
  context: ({ req }) => {
    const token = req.headers.authorization || '';
    if (token) {
      try {
        const decoded = jwt.verify(token.split(' ')[1], 'your_secret_key');
        return { user: decoded }; // user information added to context
      } catch (err) {
        throw new Error('Unauthorized');
      }
    }
    return {};
  }
});

server.listen().then(({ url }) => {
  console.log(`Server ready at ${url}`);
});

এখানে, আমরা Authorization Header থেকে JWT টোকেন বের করেছি, তা যাচাই করেছি, এবং context এ ইউজারের তথ্য সংরক্ষণ করেছি। এরপর, রেজোলভারগুলিতে এই তথ্য ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ করা হয়েছে।


RBAC এর সুবিধা

  1. নিরাপত্তা: RBAC ব্যবহার করে আপনি ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন, যাতে কোনো অপ্রয়োজনীয় ব্যবহারকারী বা ভূমিকামূলক ব্যবহারের জন্য অ্যাক্সেস অনুমতি না থাকে।
  2. স্কেলযোগ্যতা: নতুন রোল বা অনুমতি যোগ করা সহজ, যা বড় অ্যাপ্লিকেশনগুলোতে উপকারী।
  3. ব্যবহারকারী অভিজ্ঞতা: রোল অনুযায়ী অ্যাক্সেস সীমাবদ্ধ করা হলে, ব্যবহারকারীরা তাদের জন্য অনুমোদিত ডেটা এবং কার্যকলাপ দেখতে পারে, যা ব্যবহারকারী অভিজ্ঞতাকে উন্নত করে।

সারাংশ

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

Content added By
Promotion

Are you sure to start over?

Loading...