paint-brush
লগইন এর বাইরে: ZITADEL এর সাথে সূক্ষ্ম-দানাযুক্ত অনুমোদন বাস্তবায়ন করুনদ্বারা@zitadel
3,963 পড়া
3,963 পড়া

লগইন এর বাইরে: ZITADEL এর সাথে সূক্ষ্ম-দানাযুক্ত অনুমোদন বাস্তবায়ন করুন

দ্বারা ZITADEL20m2023/11/10
Read on Terminal Reader

অতিদীর্ঘ; পড়তে

এই নিবন্ধটি প্রথাগত ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোল থেকে সূক্ষ্ম-দানাযুক্ত সুরক্ষায় রূপান্তরিত করে। ZITADEL গতিশীল বৈশিষ্ট্য সহ অনুমোদন বাড়ায় এবং উপযোগী প্রয়োজনের জন্য বাহ্যিক একীকরণ সমর্থন করে। একটি ব্যবহারিক উদাহরণ এই নীতিগুলিকে কর্মে তুলে ধরে। হ্যান্ড-অন ডেভেলপারদের জন্য, নিবন্ধটি পাইথনে একটি সম্পূর্ণ কোড বাস্তবায়ন কভার করে।
featured image - লগইন এর বাইরে: ZITADEL এর সাথে সূক্ষ্ম-দানাযুক্ত অনুমোদন বাস্তবায়ন করুন
ZITADEL HackerNoon profile picture
0-item
1-item


ভূমিকা

আমরা যখন শূন্য-বিশ্বাসের মানসিকতার দিকে অগ্রসর হই, প্রথাগত RBAC সিস্টেমের মতো মোটা দানাদার নিরাপত্তা ব্যবস্থার সীমাবদ্ধতা স্পষ্ট হয়ে ওঠে। শূন্য ট্রাস্টে স্থানান্তরের একটি অপরিহার্য অংশ যা প্রায়শই আলোচনার বাইরে থাকে তা হল মোটা দানাদার থেকে সূক্ষ্ম-দানাযুক্ত নিরাপত্তার দিকে সরানো৷


সূক্ষ্ম-দানাযুক্ত অনুমোদন ব্যবহারকারীর ভূমিকা, ক্রিয়া এবং এমনকি সময় বা অবস্থানের মতো প্রেক্ষাপটের মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেসের মাধ্যমে এটিকে মোকাবেলা করে এবং আধুনিক অ্যাপ্লিকেশনগুলির জন্য এই ধরনের বিস্তারিত অ্যাক্সেস নিয়ন্ত্রণ অত্যাবশ্যক। এই নিবন্ধটি কিভাবে আলোচনা জিটাডেল এই ধরনের সংক্ষিপ্ত অনুমোদনের প্রয়োজনীয়তা পূরণ করে।


ভূমিকা, মেটা-ডেটা এবং অ্যাকশনের মতো ZITADEL এর বৈশিষ্ট্যগুলির সাথে, ব্যবহারকারীরা শূন্য-বিশ্বাসের সেটিং এর জন্য উপযুক্ত অত্যন্ত বিস্তারিত অ্যাক্সেস নিয়ন্ত্রণ পেতে পারেন। অতিরিক্তভাবে, ZITADEL বাহ্যিক অনুমোদন পরিষেবাগুলির সাথে কাজ করতে পারে।

ZITADEL দ্বারা অফার করা অনুমোদন প্রক্রিয়া

জিটাডেল হল একটি মুক্ত উৎস , ক্লাউড-নেটিভ আইডেন্টিটি অ্যান্ড অ্যাকসেস ম্যানেজমেন্ট সলিউশন (IAM) Go-তে লেখা। ZITADEL একটি SaaS সমাধান হিসাবে উপলব্ধ, এবং এটি নমনীয়তা নিশ্চিত করে স্ব-হোস্টিং বিকল্পগুলির সন্ধানকারীদের জন্য ওপেন সোর্স। এটি B2C এবং B2B উভয় ক্ষেত্রেই ব্যবহার করে।


এর প্রাথমিক উদ্দেশ্যগুলির মধ্যে রয়েছে প্রমাণীকরণ, অনুমোদন, লগইন এবং একক সাইন-অন (SSO) এর জন্য টার্নকি বৈশিষ্ট্যগুলি প্রদান করা এবং ব্যবহারকারী ইন্টারফেসের মাধ্যমে কাস্টমাইজেশনের অনুমতি দেওয়া।


এটি সমস্ত পরিবর্তনগুলি ট্র্যাক করার জন্য একটি বিস্তৃত অডিট ট্রেল সহ আসে, ডেভেলপারদের কাস্টম কোড (ক্রিয়া) সহ কার্যকারিতা প্রসারিত করতে সক্ষম করে, OIDC, OAuth, SAML এবং LDAP এর মতো ব্যাপকভাবে স্বীকৃত মানগুলিকে সমর্থন করে, পরিচালনার সহজতা এবং স্কেলেবিলিটির উপর জোর দেয় এবং এর জন্য ব্যাপক APIs অফার করে বহুমুখী ইন্টিগ্রেশন

ভূমিকা-ভিত্তিক অ্যাক্সেস কন্ট্রোল (RBAC) এবং অর্পিত অ্যাক্সেস

ZITADEL ব্যবহারকারীর অনুমতিগুলি পরিচালনা করতে RBAC ব্যবহার করে, যেখানে অনুমতিগুলি ভূমিকার সাথে সংযুক্ত থাকে এবং ব্যবহারকারীদের এই ভূমিকাগুলি বরাদ্দ করা হয়। এটি তাদের সাংগঠনিক ভূমিকার উপর ভিত্তি করে ব্যবহারকারীর অ্যাক্সেস পরিচালনাকে সহজ করে। একটি অতিরিক্ত বৈশিষ্ট্য বহিরাগত সত্ত্বার সাথে অনুমতি ভাগ করে নেওয়ার সুবিধা প্রদান করে অন্য সংস্থাকে ভূমিকা অর্পণ করার অনুমতি দেয়।


এটি আন্তঃসংযুক্ত বা শ্রেণিবদ্ধ সংস্থাগুলির জন্য বিশেষভাবে মূল্যবান।


যদিও এই ক্ষমতাগুলি শক্তিশালী অ্যাক্সেস কন্ট্রোল অফার করে, সেগুলি জটিল অনুমোদনের প্রয়োজনের জন্য যথেষ্ট নাও হতে পারে, তাই ZITADEL-এ সূক্ষ্ম-দানাযুক্ত অনুমোদন অন্বেষণের গুরুত্ব।

অ্যাট্রিবিউট-ভিত্তিক অ্যাক্সেস কন্ট্রোল (ABAC) এর জন্য অ্যাকশন বৈশিষ্ট্য, কাস্টম মেটাডেটা এবং দাবি

ZITADEL এর গতিশীল প্রবর্তনের মাধ্যমে ঐতিহ্যবাহী RBAC উন্নত করে কর্ম বৈশিষ্ট্য-ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ (ABAC) এর জন্য বৈশিষ্ট্য। আরবিএসি থেকে ভিন্ন, যা ব্যবহারকারীর ভূমিকার উপর ভিত্তি করে অ্যাক্সেস মঞ্জুর করে, ABAC আরও বহুমুখী, অ্যাক্সেস অনুরোধের সময় ব্যবহারকারী, ক্রিয়া এবং সংস্থানের সাথে সংযুক্ত বৈশিষ্ট্যগুলি মূল্যায়ন করে।


ZITADEL-এর ক্রিয়াকলাপের সাথে, নির্দিষ্ট ব্যবহারকারীর গুণাবলী বিশ্লেষণ করতে এবং প্রয়োজনে অ্যাক্সেস ব্লক করার জন্য পোস্ট-অথেন্টিকেশন স্ক্রিপ্ট তৈরি করা যেতে পারে।


অ্যাকশনগুলি ABAC সিস্টেমকে উত্সাহিত করার জন্য কাস্টম দাবিগুলিও স্থাপন করতে পারে, উন্নত অনুমোদনের মডেলগুলিকে সক্ষম করে যা অবস্থান, সময় বা কোনও নির্দিষ্ট কারণের মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেস সীমাবদ্ধ করে।


ZITADEL অ্যাডমিনিস্ট্রেটরদের বা অনুমোদিত ডেভেলপারদের ব্যবহারকারী এবং সংস্থাগুলিতে কাস্টম মেটাডেটা যোগ করতে দেয়, সূক্ষ্ম-দানাযুক্ত অ্যাক্সেস নিয়ন্ত্রণের সম্ভাবনাগুলিকে প্রশস্ত করে৷


এটি সিআরএম বা এইচআর টুলের মতো বাহ্যিক সিস্টেম থেকে অতিরিক্ত ডেটা সংগ্রহ করে সমষ্টিগত দাবি সমর্থন করে। ZITADEL শিপিং অর্ডার বা IoT ডিভাইসের মতো অনন্য সংস্থানগুলিও পরিচালনা করতে পারে এবং ব্যবহারকারী-সাব, ভূমিকা, দাবি, আইপি এবং আরও অনেক কিছুর মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেস নির্ধারণ করতে পারে।

সূক্ষ্ম-দানাযুক্ত অ্যাক্সেস নিয়ন্ত্রণের জন্য ZITADEL-এর বিদ্যমান ক্ষমতা প্রসারিত করা

ZITADEL-এর সাথে আসা ব্যাপক বৈশিষ্ট্য থাকা সত্ত্বেও, এমন কিছু উদাহরণ থাকতে পারে যেখানে আরও কাস্টমাইজড বা সূক্ষ্ম পদ্ধতির প্রয়োজন।


বর্তমানে, ZITADEL-এ সূক্ষ্ম অনুমোদন বাস্তবায়নের সবচেয়ে কার্যকর উপায় হল ছোট প্রকল্পের জন্য কাস্টম অ্যাপ্লিকেশন লজিক ব্যবহার করে, বা বড় স্কেল প্রকল্পগুলির জন্য, একটি উপলব্ধ তৃতীয় পক্ষের টুল যেমন warrant.dev , cerbos.dev , ইত্যাদি ব্যবহার করে।


এই সরঞ্জামগুলি ZITADEL-এর সাথে একীভূত হতে পারে, আরও সূক্ষ্ম, সূক্ষ্ম অনুমোদনের জন্য আপনার ক্ষমতা বাড়াতে পারে।

একটি ব্যবহারিক উদাহরণ

ধরা যাক একটি মিডিয়া কোম্পানিতে একটি অনুমানমূলক নিউজরুম অ্যাপ্লিকেশন রয়েছে, যা একটি ব্যাক-এন্ড API এর সাথে কথা বলে। সাংবাদিকরা এটি লিখতে ব্যবহার করেন, যখন সম্পাদকরা এই নিবন্ধগুলি সম্পাদনা করে এবং প্রকাশ করেন। এই উদাহরণে পাইথন ফ্লাস্কে লেখা এই API-এর নির্দিষ্ট শেষ পয়েন্ট রয়েছে এবং এই শেষ পয়েন্টগুলিতে অ্যাক্সেস ব্যবহারকারীর ভূমিকা এবং তারা কতটা অভিজ্ঞ তার উপর নির্ভর করে। শেষ পয়েন্ট:


  • write_article : শুধুমাত্র সাংবাদিকদের লেখার জন্য।


  • edit_article : শুধু সম্পাদকদের নিবন্ধ সম্পাদনা করার জন্য।


  • review_articles : সিনিয়র সাংবাদিক এবং মধ্যবর্তী এবং সিনিয়র সম্পাদকদের নিবন্ধ পর্যালোচনা করার জন্য।


  • publish_article : মধ্যবর্তী এবং সিনিয়র সাংবাদিক এবং সিনিয়র সম্পাদকদের প্রকাশ করার জন্য। অভ্যন্তরীণভাবে, কে অনুরোধ করছে তা পরীক্ষা করার জন্য API ZITADEL দ্বারা জারি করা একটি JWT ব্যবহার করে। ব্যবহারকারীদের তাদের অনুরোধের শিরোনামে একটি বৈধ JWT পাঠাতে হবে। ব্যবহারকারী লগ ইন করার সময় এই JWT প্রাপ্ত হয়েছিল।


    JWT-তে ব্যবহারকারীর ভূমিকা এবং অভিজ্ঞতার মতো তথ্য রয়েছে। কাস্টম দাবির মধ্যে থাকা এই তথ্যটি এই ব্যবহারের ক্ষেত্রে মূল। ব্যাকএন্ড সিদ্ধান্ত নেয় যে ব্যবহারকারী এই তথ্যের উপর ভিত্তি করে অনুরোধ করা সংস্থান অ্যাক্সেস করতে পারে কিনা।

অ্যাপ্লিকেশন লজিক

চিত্র 1: লগইন এর বাইরে সূক্ষ্ম-দানাযুক্ত অনুমোদনের মিথস্ক্রিয়া



  • ব্যবহারকারী অনবোর্ডিং : ব্যবহারকারী অনবোর্ডিং প্রক্রিয়া চলাকালীন, প্রতিটি ব্যবহারকারী একটি ভূমিকা পায়, যেমন, journalist বা editor । এটি গুরুত্বপূর্ণ কারণ এটি সেট করে যে কে আমাদের সেটআপে কী অ্যাক্সেস পাবে। পরিচালনার অভিজ্ঞতা/জ্যেষ্ঠতা: ভূমিকা ছাড়াও, একজন ব্যবহারকারীর অভিজ্ঞতা (যেমন আমাদের উদাহরণে junior , intermediate এবং senior ) ট্র্যাক করা হয়। যদি একজন ব্যবহারকারীর অভিজ্ঞতা পরিবর্তিত হয়, ZITADEL এটি মেটাডেটা হিসাবে আপডেট করে। যদি কোনও ব্যবহারকারী ZITADEL-এ যাওয়ার সময় কোনও অভিজ্ঞতার স্তর উল্লেখ না করে, তবে সিস্টেমটি কেবল ধরে নেয় যে এটি 'জুনিয়র'।


  • ব্যবহারকারী লগইন : একজন ব্যবহারকারীকে প্রথমে API অ্যাক্সেস করতে লগইন করতে হবে। সফল লগইন করার পরে, ZITADEL ব্যবহারকারীর তথ্য সহ একটি টোকেন ফেরত দেয়।


  • টোকেন যাচাইকরণ: যখন কোনো ব্যবহারকারীর কাছ থেকে কোনো অনুরোধ এপিআইকে আঘাত করে, তখন এপিআই ZITADEL-এর টোকেন ইন্ট্রোস্পেকশন এন্ডপয়েন্টে কল করে টোকেনটিকে যাচাই করে। যদিও JWTs স্থানীয়ভাবে JWKS ব্যবহার করে যাচাই করা যেতে পারে, আমরা ZITADEL এর পদ্ধতিতে গিয়েছিলাম ভালো নিরাপত্তা এবং তাৎক্ষণিক টোকেন চেকের জন্য টোকেন পরিদর্শন করার জন্য। এইভাবে, আমরা তাত্ক্ষণিকভাবে টোকেনগুলি প্রত্যাহার করতে পারি, সেগুলিকে এক জায়গা থেকে পরিচালনা করতে পারি এবং কম নিরাপত্তা সমস্যা থাকতে পারি৷ এটি আমাদের API এর লগইন এবং অ্যাক্সেস নিয়ন্ত্রণগুলিকে সার্ভারের সাথে শক্তিশালী এবং আপ-টু-ডেট রাখে।


  • ফাইন-গ্রেইনড অ্যাক্সেস কন্ট্রোল: অ্যাপ্লিকেশনটি ব্যবহারকারীর ভূমিকা এবং অভিজ্ঞতার স্তরের উপর ভিত্তি করে সংস্থানগুলিতে অ্যাক্সেস অনুমোদনের জন্য দায়ী। এটি একটি পূর্বনির্ধারিত অ্যাক্সেস কন্ট্রোল তালিকা ব্যবহার করে যা প্রতিটি রিসোর্স এন্ডপয়েন্টকে ব্যবহারকারীর ভূমিকা এবং সেগুলি অ্যাক্সেস করার জন্য অনুমোদিত অভিজ্ঞতার স্তরগুলিতে ম্যাপ করে। এই তালিকাটি সংস্থানগুলিতে অ্যাক্সেস মঞ্জুর বা অস্বীকার করার নিয়মপুস্তক হিসাবে কাজ করে।


  • উদ্বেগের বিচ্ছেদ : এই API এর ডিজাইনে, ব্যবসায়িক যুক্তি এবং অ্যাক্সেস নিয়ন্ত্রণ নিয়মগুলি পরিষ্কারভাবে আলাদা করা হয়েছে তা নিশ্চিত করার জন্য বিশেষ মনোযোগ দেওয়া হয়েছিল। এটি অ্যাপ্লিকেশনের রক্ষণাবেক্ষণযোগ্যতা এবং মাপযোগ্যতার জন্য অত্যন্ত গুরুত্বপূর্ণ। ব্যবসায়িক যুক্তি এবং অ্যাক্সেসের নিয়মগুলিকে আলাদা রেখে, আমরা একটি ক্লিনার, মডুলার ডিজাইন পাই।


    এটি আমাদের একে অপরকে প্রভাবিত না করে ব্যবসায়িক ক্রিয়াকলাপ এবং অ্যাক্সেসের নিয়মগুলি আপডেট করতে দেয়। এটি কোডের রক্ষণাবেক্ষণযোগ্যতা বাড়ায় এবং অ্যাপ্লিকেশন স্কেল হিসাবে এটি পরিচালনা করা সহজ করে তোলে।


    উপরন্তু, এই নকশাটি সিস্টেমটিকে আরও সুরক্ষিত করে তোলে কারণ অ্যাক্সেসের নিয়মগুলি মূল ব্যবসায়িক যুক্তি থেকে দূরে সরে যায়, ব্যবসায়িক যুক্তি পরিবর্তন করার সময় দুর্ঘটনাক্রমে নিরাপত্তা দুর্বলতা প্রবর্তনের ঝুঁকি হ্রাস করে।

ZITADEL সেট আপ করুন

1. মিডিয়া হাউস অর্গানাইজেশন, নিউজরুম প্রজেক্ট এবং আর্টিকেল API তৈরি করুন

  1. মিডিয়া হাউস সংস্থা তৈরি করুন, প্রকল্পগুলিতে যান এবং নিউজরুম নামে একটি নতুন প্রকল্প তৈরি করুন।



  2. নিউজরুম প্রকল্পে, একটি নতুন অ্যাপ্লিকেশন তৈরি করতে নতুন বোতামে ক্লিক করুন।



  1. একটি নাম যোগ করুন, এবং টাইপ API নির্বাচন করুন।



  1. প্রমাণীকরণ পদ্ধতি হিসাবে মৌলিক নির্বাচন করুন এবং অবিরত ক্লিক করুন।



  1. এখন আপনার কনফিগারেশন পর্যালোচনা করুন, এবং তৈরি করুন ক্লিক করুন।



  1. আপনি এখন API এর ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট দেখতে পাবেন। তাদের অনুলিপি এবং তাদের সংরক্ষণ করুন. বন্ধ ক্লিক করুন.



  1. আপনি বাম দিকে URL গুলি ক্লিক করলে, আপনি প্রাসঙ্গিক OIDC URL দেখতে পাবেন৷ ইস্যুকারী URL, token_endpoint এবং introspection_endpoint নোট করুন।



2. নিউজরুম প্রকল্পে ভূমিকা তৈরি করুন

  1. এছাড়াও, আপনার প্রকল্পের রিসোর্স আইডি নোট করুন (প্রকল্পে যান এবং রিসোর্স আইডি কপি করুন)



  1. প্রোজেক্ট ড্যাশবোর্ডে প্রমাণীকরণ চেকবক্সে অ্যাসার্ট রোলস নির্বাচন করুন এবং সংরক্ষণ করুন ক্লিক করুন।



  1. ভূমিকাতে যান (বাম মেনু থেকে), এবং নতুন ভূমিকা যোগ করতে নতুন ক্লিক করুন।



  1. নীচে দেখানো হিসাবে সম্পাদক এবং সাংবাদিকের ভূমিকা লিখুন, এবং সংরক্ষণ করুন ক্লিক করুন।



  1. আপনি এখন তৈরি ভূমিকা দেখতে পাবেন.



3. নিউজরুম প্রকল্পে ব্যবহারকারী তৈরি করুন

  1. নীচে দেখানো হিসাবে আপনার সংস্থার ব্যবহারকারী ট্যাবে যান এবং পরিষেবা ব্যবহারকারী ট্যাবে যান। আমরা এই ডেমোতে পরিষেবা ব্যবহারকারী তৈরি করব। একটি পরিষেবা ব্যবহারকারী যোগ করতে, নতুন বোতামে ক্লিক করুন।


    পরিষেবা ব্যবহারকারী তৈরি করুন


  2. এরপরে, পরিষেবা ব্যবহারকারীর বিবরণ যোগ করুন, অ্যাক্সেস টোকেন প্রকারের জন্য JWT নির্বাচন করুন এবং তৈরি করুন ক্লিক করুন।


    পরিষেবা ব্যবহারকারী তৈরি করুন


  3. উপরের ডানদিকের কোণায় অ্যাকশন বোতামে ক্লিক করুন। ড্রপ-ডাউন মেনু থেকে জেনারেট ক্লায়েন্ট সিক্রেট নির্বাচন করুন।




  4. আপনার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট কপি করুন। বন্ধ ক্লিক করুন.



  5. এখন, আপনার কাছে একটি পরিষেবা ব্যবহারকারী রয়েছে, তাদের ক্লায়েন্ট শংসাপত্র সহ।

4. ব্যবহারকারীদের জন্য অনুমোদন যোগ করুন

  1. অনুমোদনে যান। নতুন ক্লিক করুন.


  2. ব্যবহারকারী এবং প্রকল্প নির্বাচন করুন যার জন্য অনুমোদন তৈরি করতে হবে। অবিরত ক্লিক করুন.



  3. আপনি এখানে একটি ভূমিকা নির্বাচন করতে পারেন. বর্তমান ব্যবহারকারীর জন্য সাংবাদিকের ভূমিকা নির্বাচন করুন। সংরক্ষণ করুন ক্লিক করুন.


    অনুমোদন যোগ করুন


  4. আপনি দেখতে পাচ্ছেন যে পরিষেবা ব্যবহারকারী লোইস লেন এখন নিউজরুম প্রকল্পে সাংবাদিকের ভূমিকায় রয়েছে৷



5. ব্যবহারকারীদের মেটাডেটা যোগ করুন

এখন, তাদের জ্যেষ্ঠতার স্তর নির্দেশ করতে ব্যবহারকারীর প্রোফাইলে মেটাডেটা যোগ করা যাক। কী হিসাবে 'অভিজ্ঞতা_স্তর' ব্যবহার করুন এবং এর মূল্যের জন্য 'জুনিয়র', 'ইন্টারমিডিয়েট' বা 'সিনিয়র' থেকে বেছে নিন।


যদিও আমরা সাধারণত ধরে নিতে পারি যে এই মেটাডেটাটি HR অ্যাপ্লিকেশন দ্বারা করা একটি API কলের মাধ্যমে সেট করা হয়েছে, সরলতা এবং বোঝার সুবিধার জন্য, আমরা মেটাডেটা সরাসরি কনসোলে সেট করব।


  1. মেটাডেটাতে যান। সম্পাদনা ক্লিক করুন.



  2. অভিজ্ঞতা_স্তরকে কী হিসেবে এবং সিনিয়রকে মান হিসেবে প্রদান করুন। সেভ আইকনে ক্লিক করুন এবং ক্লোজ বোতামে ক্লিক করুন।



  3. ব্যবহারকারীর কাছে এখন তাদের অ্যাকাউন্টের সাথে সম্পর্কিত প্রয়োজনীয় মেটাডেটা রয়েছে৷



  4. আপনি পূর্ববর্তী পদক্ষেপগুলি ব্যবহার করে ডেমো পরীক্ষা করতে বিভিন্ন ভূমিকা এবং অভিজ্ঞতা_স্তরের (মেটাডেটা ব্যবহার করে) সহ আরও কিছু পরিষেবা ব্যবহারকারীকে যুক্ত করতে পারেন।


6. কাস্টম দাবিতে ভূমিকা এবং মেটাডেটা ক্যাপচার করার জন্য একটি অ্যাকশন তৈরি করুন৷

1. অ্যাকশনে ক্লিক করুন। একটি নতুন কর্ম তৈরি করতে নতুন ক্লিক করুন.



2. ক্রিয়েট অ্যান অ্যাকশন বিভাগে, ক্রিয়াটিকে ফাংশনের নামের মতো একই নাম দিন, যেমন, assignRoleAndExperienceClaims। স্ক্রিপ্ট ক্ষেত্রে, নিম্নলিখিত কোডটি অনুলিপি/পেস্ট করুন এবং তারপর যোগ করুন ক্লিক করুন।



 function assignRoleAndExperienceClaims(ctx, api) { // Check if grants and metadata exist if (!ctx.v1.user.grants || !ctx.v1.claims['urn:zitadel:iam:user:metadata']) { return; } // Decode experience level from Base64 - metadata is Base64 encoded let experience_encoded = ctx.v1.claims['urn:zitadel:iam:user:metadata'].experience_level; let experience = ''; try { experience = decodeURIComponent(escape(String.fromCharCode.apply(null, experience_encoded.split('').map(function(c) { return '0x' + ('0' + c.charCodeAt(0).toString(16)).slice(-2); })))); } catch (e) { return; // If decoding fails, stop executing the function } // Check if the experience level exists if (!experience) { return; } // Iterate through the user's grants ctx.v1.user.grants.grants.forEach(grant => { // Iterate through the roles of each grant grant.roles.forEach(role => { // Check if the user is a journalist if (role === 'journalist') { // Set custom claims with the user's role and experience level api.v1.claims.setClaim('journalist:experience_level', experience); } // Check if the user is an editor else if (role === 'editor') { // Set custom claims with the user's role and experience level api.v1.claims.setClaim('editor:experience_level', experience); } }); }); }


  1. assignRoleAndExperienceClaims এখন একটি ক্রিয়া হিসাবে তালিকাভুক্ত করা হবে৷



  1. এর পরে, আমাদের অবশ্যই একটি ফ্লো টাইপ নির্বাচন করতে হবে। নীচের প্রবাহ বিভাগে যান. ড্রপডাউন থেকে কমপ্লিমেন্ট টোকেন নির্বাচন করুন।



  1. এখন, আপনাকে একটি ট্রিগার চয়ন করতে হবে। ট্রিগার যোগ করুন ক্লিক করুন। ট্রিগার প্রকার হিসাবে প্রাক-অ্যাক্সেস টোকেন তৈরি নির্বাচন করুন এবং সংশ্লিষ্ট ক্রিয়া হিসাবে assignRoleAndExperienceClaims নির্বাচন করুন।



  1. এবং এখন, আপনি তালিকাভুক্ত ট্রিগার দেখতে পাবেন।



এখন, যখন একজন ব্যবহারকারী একটি অ্যাক্সেস টোকেনের অনুরোধ করেন, তখন ব্যবহারকারীর ভূমিকা এবং মেটাডেটাকে প্রয়োজনীয় বিন্যাসে রূপান্তরিত করে এবং টোকেনে একটি কাস্টম দাবি হিসাবে যুক্ত করে, অ্যাকশনটি কার্যকর করা হবে। এই কাস্টম দাবি তারপর সূক্ষ্ম ব্যবহারকারী অ্যাক্সেস পরিচালনা করতে তৃতীয় পক্ষের অ্যাপ্লিকেশন দ্বারা ব্যবহার করা যেতে পারে।

API প্রকল্প সেট আপ করুন

GitHub থেকে প্রকল্প ক্লোন করুন:

এই GitHub সংগ্রহস্থল থেকে প্রকল্পটি ক্লোন করতে নীচের কমান্ডটি চালান:

  • git clone https://github.com/zitadel/example-fine-grained-authorization.git


প্রকল্প ডিরেক্টরিতে নেভিগেট করুন:

ক্লোনিংয়ের পরে, এর সাথে প্রকল্প ডিরেক্টরিতে নেভিগেট করুন

  • cd example-fine-grained-authorization


একটি পাইথন পরিবেশ সেটআপ করুন:

আপনার পাইথন 3 এবং পিপ ইনস্টল করা আছে তা নিশ্চিত করুন। আপনি রান করে এটি পরীক্ষা করতে পারেন

  • python3 --version এবং
  • pip3 --version

আপনার টার্মিনালে। আপনার যদি পাইথন বা পিপ ইনস্টল না থাকে তবে আপনাকে সেগুলি ইনস্টল করতে হবে।


এর পরে, এই প্রকল্পটি চালানোর মাধ্যমে একটি নতুন ভার্চুয়াল পরিবেশ তৈরি করুন

  • python3 -m venv env .


চালানোর মাধ্যমে পরিবেশ সক্রিয় করুন:

  • উইন্ডোজে: .\env\Scripts\activate
  • ইউনিক্স বা MacOS-এ: source env/bin/activate


এই কমান্ডটি চালানোর পরে, আপনার টার্মিনালটি নির্দেশ করবে যে আপনি এখন env ভার্চুয়াল পরিবেশে কাজ করছেন।


নির্ভরতা ইনস্টল করুন:

প্রজেক্ট ডাইরেক্টরীতে টার্মিনালের সাথে (একটি রিকুয়ারমেন্টস.txt আছে), চালান

  • pip3 install -r requirements.txt

প্রয়োজনীয় নির্ভরতা ইনস্টল করতে।


এনভায়রনমেন্ট ভেরিয়েবল কনফিগার করুন:

প্রকল্পের নির্দিষ্ট পরিবেশের পরিবর্তনশীল প্রয়োজন। আমরা ZITADEL থেকে প্রাপ্ত মান দিয়ে .env ফাইলটি পূরণ করুন।

 PROJECT_ID="<YOUR PROJECT ID>" ZITADEL_DOMAIN="<YOUR INSTANCE DOMAIN eg https://instance-as23uy.zitadel.cloud>" ZITADEL_TOKEN_URL="<YOUR TOKEN URL eg https://instance-as23uy.zitadel.cloud/oauth/v2/token" CLIENT_ID="<YOUR SERVICE USER'S CLIENT ID FROM THE GENERATED CLIENT CREDENTIALS eg sj_Alice>" CLIENT_SECRET="<YOUR SERVICE USER'S SECRET FROM THE GENERATED CLIENT CREDENTIALS"> ZITADEL_INTROSPECTION_URL="<YOUR INTROSPECTION URL eg https://instance-as23uy.zitadel.cloud/oauth/v2/introspect>" API_CLIENT_ID="<THE CLIENT ID OF YOUR API APPLICATION FOR BASIC AUTH eg 324545668690006737@api>" API_CLIENT_SECRET="<THE CLIENT SECRET OF YOUR API APPLICATION FOR BASIC AUTH>"


অ্যাপ্লিকেশন চালান:

ফ্লাস্ক এপিআই ( app.py এ ) JWT টোকেন এবং সূক্ষ্ম অ্যাক্সেস নিয়ন্ত্রণের জন্য কাস্টম দাবি ব্যবহার করে। এটি প্রতিটি অনুরোধে journalist এবং editor ভূমিকার জন্য কাস্টম দাবির অভিজ্ঞতা_স্তর পরীক্ষা করে, এই তথ্যটি ব্যবহার করে যাচাই করা ব্যবহারকারী অনুরোধ করা শেষ পয়েন্টে অ্যাক্সেস করতে পারে কিনা।


app.py

 from flask import Flask, jsonify from auth import token_required from access_control import authorize_access app = Flask(__name__) # Define the /write_article route. @app.route('/write_article', methods=['POST']) @token_required def write_article(): authorization = authorize_access('write_article') if authorization is not True: return authorization # Resource-specific code goes here... return jsonify({"message": "Article written successfully!"}), 200 # Define the /edit_article route. @app.route('/edit_article', methods=['PUT']) @token_required def edit_article(): authorization = authorize_access('edit_article') if authorization is not True: return authorization # Resource-specific code goes here... return jsonify({"message": "Article edited successfully!"}), 200 # Define the /review_article route. @app.route('/review_articles', methods=['GET']) @token_required def review_article(): authorization = authorize_access('review_article') if authorization is not True: return authorization # Resource-specific code goes here... return jsonify({"message": "Article review accessed successfully!"}), 200 # Define the /publish_article route. @app.route('/publish_article', methods=['POST']) @token_required def publish_article(): authorization = authorize_access('publish_article') if authorization is not True: return authorization # Resource-specific code goes here... return jsonify({"message": "Article published successfully!"}), 200 # Add more endpoints as needed... if __name__ == '__main__': app.run(debug=True)


auth.py

 import os import jwt import requests from functools import wraps from flask import request, jsonify, g ZITADEL_INTROSPECTION_URL = os.getenv('ZITADEL_INTROSPECTION_URL') API_CLIENT_ID = os.getenv('API_CLIENT_ID') API_CLIENT_SECRET = os.getenv('API_CLIENT_SECRET') # This function checks the token introspection and populates the flask.g variable with the user's token def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = request.headers.get('Authorization') if not token: abort(401) # Return status code 401 for Unauthorized if there's no token else: token = token.split(' ')[1] # The token is in the format "Bearer <token>", we want to extract the actual token # Call the introspection endpoint introspection_response = requests.post( ZITADEL_INTROSPECTION_URL, auth=(API_CLIENT_ID, API_CLIENT_SECRET), data={'token': token} ) if not introspection_response.json().get('active', False): return jsonify({"message": "Invalid token"}), 403 # Decode the token and print it for inspection decoded_token = jwt.decode(token, options={"verify_signature": False}) print(f"\n\n***** Decoded Token: {decoded_token} \n\n******") # Add the decoded token to Flask's global context g.token = decoded_token return f(*args, **kwargs) return decorated


access_control.py (একটি নিয়ম ইঞ্জিনের নমুনা কোড)

 import base64 import jwt from flask import g, jsonify # The access_requirements dictionary represents your access control rules. access_requirements = { 'write_article': [{'role': 'journalist', 'experience_level': 'junior'}, {'role': 'journalist', 'experience_level': 'intermediate'}, {'role': 'journalist', 'experience_level': 'senior'}], 'edit_article': [{'role': 'editor', 'experience_level': 'junior'}, {'role': 'editor', 'experience_level': 'intermediate'}, {'role': 'editor', 'experience_level': 'senior'}], 'review_articles': [{'role': 'journalist', 'experience_level': 'senior'}, {'role': 'editor', 'experience_level': 'intermediate'}, {'role': 'editor', 'experience_level': 'senior'}], 'publish_article': [{'role': 'journalist', 'experience_level': 'intermediate'}, {'role': 'journalist', 'experience_level': 'senior'}, {'role': 'editor', 'experience_level': 'senior'}] # Add more endpoints as needed... } # This function checks if the user is authorized to access the given endpoint. def authorize_access(endpoint): # We assume that the token has already been decoded in auth.py decoded_token = g.token # Initialize role and experience_level variables role = None experience_level = None for claim, value in decoded_token.items(): if ':experience_level' in claim: role, _ = claim.split(':') experience_level = base64.b64decode(value).decode('utf-8') break # If there's no role in the token, return an error if not role: return jsonify({"message": "Missing role"}), 403 # If there's a role in the token but no experience level, default the experience level to 'junior' if role and not experience_level: experience_level = 'junior' # If there's no role or experience level in the token, return an error if not role or not experience_level: return jsonify({"message": "Missing role or experience level"}), 403 # Get the requirements for the requested endpoint endpoint_requirements = access_requirements.get(endpoint) # If the endpoint is not in the access control list, return an error if not endpoint_requirements: return jsonify({"message": "Endpoint not found in access control list"}), 403 # Check if the user's role and experience level meet the requirements for the requested endpoint for requirement in endpoint_requirements: required_role = requirement['role'] required_experience_level = requirement['experience_level'] # Experience level hierarchy experience_levels = ['junior', 'intermediate', 'senior'] if role == required_role and experience_levels.index(experience_level) >= experience_levels.index(required_experience_level): return True #return jsonify({"message": "Access denied"}), 403 return jsonify({"message": f"Access denied! You are a {experience_level} {role} and therefore cannot access {endpoint}"}), 403


সম্পাদন করে ফ্লাস্ক অ্যাপ্লিকেশন চালান:

python3 app.py


সবকিছু সঠিকভাবে সেট আপ করা থাকলে, আপনার ফ্লাস্ক অ্যাপ্লিকেশনটি এখন চলমান হওয়া উচিত।


এই প্রকল্পটি পাইথন 3 দিয়ে তৈরি এবং পরীক্ষা করা হয়েছে, তাই নিশ্চিত করুন যে আপনি একটি পাইথন 3 দোভাষী ব্যবহার করছেন।

এপিআই চালান এবং পরীক্ষা করুন

API চালান

  1. নিশ্চিত করুন যে আপনি সংগ্রহস্থল ক্লোন করেছেন এবং পূর্বে বর্ণিত প্রয়োজনীয় নির্ভরতা ইনস্টল করেছেন।


  2. একটি অ্যাক্সেস টোকেন তৈরি করতে client_credentials_token_generator.py স্ক্রিপ্টটি চালান।


    client_credentials_token_generator.py

     import os import requests import base64 from dotenv import load_dotenv load_dotenv() ZITADEL_DOMAIN = os.getenv("ZITADEL_DOMAIN") CLIENT_ID = os.getenv("CLIENT_ID") CLIENT_SECRET = os.getenv("CLIENT_SECRET") ZITADEL_TOKEN_URL = os.getenv("ZITADEL_TOKEN_URL") PROJECT_ID = os.getenv("PROJECT_ID") # Encode the client ID and client secret in Base64 client_credentials = f"{CLIENT_ID}:{CLIENT_SECRET}".encode("utf-8") base64_client_credentials = base64.b64encode(client_credentials).decode("utf-8") # Request an OAuth token from ZITADEL headers = { "Content-Type": "application/x-www-form-urlencoded", "Authorization": f"Basic {base64_client_credentials}" } data = { "grant_type": "client_credentials", "scope": f"openid profile email urn:zitadel:iam:org:project:id:{PROJECT_ID}:aud urn:zitadel:iam:org:projects:roles urn:zitadel:iam:user:metadata" } response = requests.post(ZITADEL_TOKEN_URL, headers=headers, data=data) if response.status_code == 200: access_token = response.json()["access_token"] print(f"Response: {response.json()}") print(f"Access token: {access_token}") else: print(f"Error: {response.status_code} - {response.text}")


    আপনার টার্মিনাল খুলুন এবং প্রকল্প ডিরেক্টরিতে নেভিগেট করুন, তারপর python3 ব্যবহার করে স্ক্রিপ্টটি চালান:

    python3 client_credentials_token_generator.py


  3. সফল হলে, এটি আপনার টার্মিনালে একটি অ্যাক্সেস টোকেন প্রিন্ট করবে। এটি সেই টোকেন যা আপনি API-তে আপনার অনুরোধগুলিকে প্রমাণীকরণ করতে ব্যবহার করবেন।


  4. আপনি যদি আগে ফ্লাস্ক API চালু না করে থাকেন, তাহলে প্রকল্প ডিরেক্টরিতে অন্য টার্মিনাল খোলার মাধ্যমে API চালান এবং চালান:

    python3 app.py


  5. API সার্ভার এখন চলমান এবং অনুরোধ গ্রহণ করার জন্য প্রস্তুত হওয়া উচিত।


এখন, আপনি API-তে অনুরোধ করতে cURL বা অন্য কোনো HTTP ক্লায়েন্ট (যেমন পোস্টম্যান) ব্যবহার করতে পারেন। কার্ল কমান্ডে your_access_token প্রতিস্থাপন করতে মনে রাখবেন যে অ্যাক্সেস টোকেন আপনি ধাপ 2 এ প্রাপ্ত করেছেন।

API পরীক্ষা করুন

দৃশ্যকল্প 1: জুনিয়র সম্পাদক একটি নিবন্ধ সম্পাদনা করার চেষ্টা করেন (সফল)


editor ভূমিকা এবং junior অভিজ্ঞতা_স্তর সহ ব্যবহারকারী edit_article এন্ডপয়েন্ট কল করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/edit_article


  • প্রত্যাশিত আউটপুট: {"message": "Article edited successfully"}


দৃশ্যকল্প 2: জুনিয়র সম্পাদক একটি নিবন্ধ প্রকাশ করার চেষ্টা করেন (ব্যর্থতা)

editor ভূমিকা এবং junior অভিজ্ঞতা_স্তরের ব্যবহারকারী publish_article endpoint কল করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/publish_article


  • প্রত্যাশিত আউটপুট: {"message": "Access denied! You are a junior editor and therefore cannot access publish_article"}


দৃশ্য 3: সিনিয়র সাংবাদিক একটি প্রবন্ধ লেখার চেষ্টা করছেন (সফলতা)

journalist ভূমিকা এবং senior অভিজ্ঞতা_স্তরের ব্যবহারকারী write_article এন্ডপয়েন্ট কল করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/write_article

  • প্রত্যাশিত আউটপুট: {"message": "Article written successfully"}


দৃশ্যকল্প 4: জুনিয়র সাংবাদিক নিবন্ধ পর্যালোচনা করার চেষ্টা করেন (ব্যর্থতা)

journalist ভূমিকা এবং 'জুনিয়র' অভিজ্ঞতা_স্তরের ব্যবহারকারী review_articles এন্ডপয়েন্ট কল করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/review_articles


  • প্রত্যাশিত আউটপুট: {"message": "Access denied! You are a junior journalist and therefore cannot access review_articles"}


দৃশ্য 5: সিনিয়র সম্পাদক নিবন্ধ পর্যালোচনা করার চেষ্টা করেন (সফলতা)

editor ভূমিকা এবং senior অভিজ্ঞতা_স্তরের ব্যবহারকারী review_articles শেষ পয়েন্ট অ্যাক্সেস করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/review_articles


  • প্রত্যাশিত আউটপুট: {"message": "Article reviewed successfully"}


দৃশ্যকল্প 6: মধ্যবর্তী সাংবাদিক একটি প্রবন্ধ প্রকাশ করার চেষ্টা করেন (সফল)

journalist ভূমিকা এবং intermediate অভিজ্ঞতা_স্তরের ব্যবহারকারী publish_article এন্ডপয়েন্ট অ্যাক্সেস করার চেষ্টা করে।

  • curl -H "Authorization: Bearer <your_access_token>" -X POST http://localhost:5000/publish_article


  • প্রত্যাশিত আউটপুট: {"message": "Article published successfully"}

উপসংহার

এই নিবন্ধে, আমরা ZITADEL ব্যবহার করে ঐতিহ্যগত RBAC থেকে আরও বিশদ, সূক্ষ্ম-দানাযুক্ত অনুমোদন পদ্ধতিতে স্থানান্তরের গুরুত্ব অন্বেষণ করেছি।


আমরা এর বৈশিষ্ট্যগুলি যেমন ABAC-এর জন্য গতিশীল ক্রিয়া, তৃতীয়-পক্ষের সরঞ্জামগুলির সাথে একীভূত করার ক্ষমতা, এবং বাস্তব-বিশ্বের পরিস্থিতিতে কীভাবে এই ক্ষমতাগুলি ব্যবহারিকভাবে প্রয়োগ করা যেতে পারে তা দেখেছি।


সাইবার নিরাপত্তার চাহিদা বাড়ার সাথে সাথে ZITADEL-এর মতো প্ল্যাটফর্মগুলি জটিল অনুমোদনের চ্যালেঞ্জগুলির জন্য প্রয়োজনীয় সমাধান প্রদান করে।