আমরা যখন শূন্য-বিশ্বাসের মানসিকতার দিকে অগ্রসর হই, প্রথাগত RBAC সিস্টেমের মতো মোটা দানাদার নিরাপত্তা ব্যবস্থার সীমাবদ্ধতা স্পষ্ট হয়ে ওঠে। শূন্য ট্রাস্টে স্থানান্তরের একটি অপরিহার্য অংশ যা প্রায়শই আলোচনার বাইরে থাকে তা হল মোটা দানাদার থেকে সূক্ষ্ম-দানাযুক্ত নিরাপত্তার দিকে সরানো৷
সূক্ষ্ম-দানাযুক্ত অনুমোদন ব্যবহারকারীর ভূমিকা, ক্রিয়া এবং এমনকি সময় বা অবস্থানের মতো প্রেক্ষাপটের মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেসের মাধ্যমে এটিকে মোকাবেলা করে এবং আধুনিক অ্যাপ্লিকেশনগুলির জন্য এই ধরনের বিস্তারিত অ্যাক্সেস নিয়ন্ত্রণ অত্যাবশ্যক। এই নিবন্ধটি কিভাবে আলোচনা
ভূমিকা, মেটা-ডেটা এবং অ্যাকশনের মতো ZITADEL এর বৈশিষ্ট্যগুলির সাথে, ব্যবহারকারীরা শূন্য-বিশ্বাসের সেটিং এর জন্য উপযুক্ত অত্যন্ত বিস্তারিত অ্যাক্সেস নিয়ন্ত্রণ পেতে পারেন। অতিরিক্তভাবে, ZITADEL বাহ্যিক অনুমোদন পরিষেবাগুলির সাথে কাজ করতে পারে।
জিটাডেল হল একটি
এর প্রাথমিক উদ্দেশ্যগুলির মধ্যে রয়েছে প্রমাণীকরণ, অনুমোদন, লগইন এবং একক সাইন-অন (SSO) এর জন্য টার্নকি বৈশিষ্ট্যগুলি প্রদান করা এবং ব্যবহারকারী ইন্টারফেসের মাধ্যমে কাস্টমাইজেশনের অনুমতি দেওয়া।
এটি সমস্ত পরিবর্তনগুলি ট্র্যাক করার জন্য একটি বিস্তৃত অডিট ট্রেল সহ আসে, ডেভেলপারদের কাস্টম কোড (ক্রিয়া) সহ কার্যকারিতা প্রসারিত করতে সক্ষম করে, OIDC, OAuth, SAML এবং LDAP এর মতো ব্যাপকভাবে স্বীকৃত মানগুলিকে সমর্থন করে, পরিচালনার সহজতা এবং স্কেলেবিলিটির উপর জোর দেয় এবং এর জন্য ব্যাপক APIs অফার করে বহুমুখী ইন্টিগ্রেশন
ZITADEL ব্যবহারকারীর অনুমতিগুলি পরিচালনা করতে RBAC ব্যবহার করে, যেখানে অনুমতিগুলি ভূমিকার সাথে সংযুক্ত থাকে এবং ব্যবহারকারীদের এই ভূমিকাগুলি বরাদ্দ করা হয়। এটি তাদের সাংগঠনিক ভূমিকার উপর ভিত্তি করে ব্যবহারকারীর অ্যাক্সেস পরিচালনাকে সহজ করে। একটি অতিরিক্ত বৈশিষ্ট্য বহিরাগত সত্ত্বার সাথে অনুমতি ভাগ করে নেওয়ার সুবিধা প্রদান করে অন্য সংস্থাকে ভূমিকা অর্পণ করার অনুমতি দেয়।
এটি আন্তঃসংযুক্ত বা শ্রেণিবদ্ধ সংস্থাগুলির জন্য বিশেষভাবে মূল্যবান।
যদিও এই ক্ষমতাগুলি শক্তিশালী অ্যাক্সেস কন্ট্রোল অফার করে, সেগুলি জটিল অনুমোদনের প্রয়োজনের জন্য যথেষ্ট নাও হতে পারে, তাই ZITADEL-এ সূক্ষ্ম-দানাযুক্ত অনুমোদন অন্বেষণের গুরুত্ব।
ZITADEL এর গতিশীল প্রবর্তনের মাধ্যমে ঐতিহ্যবাহী RBAC উন্নত করে
ZITADEL-এর ক্রিয়াকলাপের সাথে, নির্দিষ্ট ব্যবহারকারীর গুণাবলী বিশ্লেষণ করতে এবং প্রয়োজনে অ্যাক্সেস ব্লক করার জন্য পোস্ট-অথেন্টিকেশন স্ক্রিপ্ট তৈরি করা যেতে পারে।
অ্যাকশনগুলি ABAC সিস্টেমকে উত্সাহিত করার জন্য কাস্টম দাবিগুলিও স্থাপন করতে পারে, উন্নত অনুমোদনের মডেলগুলিকে সক্ষম করে যা অবস্থান, সময় বা কোনও নির্দিষ্ট কারণের মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেস সীমাবদ্ধ করে।
ZITADEL অ্যাডমিনিস্ট্রেটরদের বা অনুমোদিত ডেভেলপারদের ব্যবহারকারী এবং সংস্থাগুলিতে কাস্টম মেটাডেটা যোগ করতে দেয়, সূক্ষ্ম-দানাযুক্ত অ্যাক্সেস নিয়ন্ত্রণের সম্ভাবনাগুলিকে প্রশস্ত করে৷
এটি সিআরএম বা এইচআর টুলের মতো বাহ্যিক সিস্টেম থেকে অতিরিক্ত ডেটা সংগ্রহ করে সমষ্টিগত দাবি সমর্থন করে। ZITADEL শিপিং অর্ডার বা IoT ডিভাইসের মতো অনন্য সংস্থানগুলিও পরিচালনা করতে পারে এবং ব্যবহারকারী-সাব, ভূমিকা, দাবি, আইপি এবং আরও অনেক কিছুর মতো বৈশিষ্ট্যগুলির উপর ভিত্তি করে অ্যাক্সেস নির্ধারণ করতে পারে।
ZITADEL-এর সাথে আসা ব্যাপক বৈশিষ্ট্য থাকা সত্ত্বেও, এমন কিছু উদাহরণ থাকতে পারে যেখানে আরও কাস্টমাইজড বা সূক্ষ্ম পদ্ধতির প্রয়োজন।
বর্তমানে, ZITADEL-এ সূক্ষ্ম অনুমোদন বাস্তবায়নের সবচেয়ে কার্যকর উপায় হল ছোট প্রকল্পের জন্য কাস্টম অ্যাপ্লিকেশন লজিক ব্যবহার করে, বা বড় স্কেল প্রকল্পগুলির জন্য, একটি উপলব্ধ তৃতীয় পক্ষের টুল যেমন warrant.dev , cerbos.dev , ইত্যাদি ব্যবহার করে।
এই সরঞ্জামগুলি ZITADEL-এর সাথে একীভূত হতে পারে, আরও সূক্ষ্ম, সূক্ষ্ম অনুমোদনের জন্য আপনার ক্ষমতা বাড়াতে পারে।
ধরা যাক একটি মিডিয়া কোম্পানিতে একটি অনুমানমূলক নিউজরুম অ্যাপ্লিকেশন রয়েছে, যা একটি ব্যাক-এন্ড API এর সাথে কথা বলে। সাংবাদিকরা এটি লিখতে ব্যবহার করেন, যখন সম্পাদকরা এই নিবন্ধগুলি সম্পাদনা করে এবং প্রকাশ করেন। এই উদাহরণে পাইথন ফ্লাস্কে লেখা এই API-এর নির্দিষ্ট শেষ পয়েন্ট রয়েছে এবং এই শেষ পয়েন্টগুলিতে অ্যাক্সেস ব্যবহারকারীর ভূমিকা এবং তারা কতটা অভিজ্ঞ তার উপর নির্ভর করে। শেষ পয়েন্ট:
write_article
: শুধুমাত্র সাংবাদিকদের লেখার জন্য।
edit_article
: শুধু সম্পাদকদের নিবন্ধ সম্পাদনা করার জন্য।
review_articles
: সিনিয়র সাংবাদিক এবং মধ্যবর্তী এবং সিনিয়র সম্পাদকদের নিবন্ধ পর্যালোচনা করার জন্য।
publish_article
: মধ্যবর্তী এবং সিনিয়র সাংবাদিক এবং সিনিয়র সম্পাদকদের প্রকাশ করার জন্য। অভ্যন্তরীণভাবে, কে অনুরোধ করছে তা পরীক্ষা করার জন্য API ZITADEL দ্বারা জারি করা একটি JWT ব্যবহার করে। ব্যবহারকারীদের তাদের অনুরোধের শিরোনামে একটি বৈধ JWT পাঠাতে হবে। ব্যবহারকারী লগ ইন করার সময় এই JWT প্রাপ্ত হয়েছিল।
JWT-তে ব্যবহারকারীর ভূমিকা এবং অভিজ্ঞতার মতো তথ্য রয়েছে। কাস্টম দাবির মধ্যে থাকা এই তথ্যটি এই ব্যবহারের ক্ষেত্রে মূল। ব্যাকএন্ড সিদ্ধান্ত নেয় যে ব্যবহারকারী এই তথ্যের উপর ভিত্তি করে অনুরোধ করা সংস্থান অ্যাক্সেস করতে পারে কিনা।
journalist
বা editor
। এটি গুরুত্বপূর্ণ কারণ এটি সেট করে যে কে আমাদের সেটআপে কী অ্যাক্সেস পাবে। পরিচালনার অভিজ্ঞতা/জ্যেষ্ঠতা: ভূমিকা ছাড়াও, একজন ব্যবহারকারীর অভিজ্ঞতা (যেমন আমাদের উদাহরণে junior
, intermediate
এবং senior
) ট্র্যাক করা হয়। যদি একজন ব্যবহারকারীর অভিজ্ঞতা পরিবর্তিত হয়, ZITADEL এটি মেটাডেটা হিসাবে আপডেট করে। যদি কোনও ব্যবহারকারী ZITADEL-এ যাওয়ার সময় কোনও অভিজ্ঞতার স্তর উল্লেখ না করে, তবে সিস্টেমটি কেবল ধরে নেয় যে এটি 'জুনিয়র'।
উদ্বেগের বিচ্ছেদ : এই API এর ডিজাইনে, ব্যবসায়িক যুক্তি এবং অ্যাক্সেস নিয়ন্ত্রণ নিয়মগুলি পরিষ্কারভাবে আলাদা করা হয়েছে তা নিশ্চিত করার জন্য বিশেষ মনোযোগ দেওয়া হয়েছিল। এটি অ্যাপ্লিকেশনের রক্ষণাবেক্ষণযোগ্যতা এবং মাপযোগ্যতার জন্য অত্যন্ত গুরুত্বপূর্ণ। ব্যবসায়িক যুক্তি এবং অ্যাক্সেসের নিয়মগুলিকে আলাদা রেখে, আমরা একটি ক্লিনার, মডুলার ডিজাইন পাই।
এটি আমাদের একে অপরকে প্রভাবিত না করে ব্যবসায়িক ক্রিয়াকলাপ এবং অ্যাক্সেসের নিয়মগুলি আপডেট করতে দেয়। এটি কোডের রক্ষণাবেক্ষণযোগ্যতা বাড়ায় এবং অ্যাপ্লিকেশন স্কেল হিসাবে এটি পরিচালনা করা সহজ করে তোলে।
উপরন্তু, এই নকশাটি সিস্টেমটিকে আরও সুরক্ষিত করে তোলে কারণ অ্যাক্সেসের নিয়মগুলি মূল ব্যবসায়িক যুক্তি থেকে দূরে সরে যায়, ব্যবসায়িক যুক্তি পরিবর্তন করার সময় দুর্ঘটনাক্রমে নিরাপত্তা দুর্বলতা প্রবর্তনের ঝুঁকি হ্রাস করে।
মিডিয়া হাউস সংস্থা তৈরি করুন, প্রকল্পগুলিতে যান এবং নিউজরুম নামে একটি নতুন প্রকল্প তৈরি করুন।
নিউজরুম প্রকল্পে, একটি নতুন অ্যাপ্লিকেশন তৈরি করতে নতুন বোতামে ক্লিক করুন।
নীচে দেখানো হিসাবে আপনার সংস্থার ব্যবহারকারী ট্যাবে যান এবং পরিষেবা ব্যবহারকারী ট্যাবে যান। আমরা এই ডেমোতে পরিষেবা ব্যবহারকারী তৈরি করব। একটি পরিষেবা ব্যবহারকারী যোগ করতে, নতুন বোতামে ক্লিক করুন।
এরপরে, পরিষেবা ব্যবহারকারীর বিবরণ যোগ করুন, অ্যাক্সেস টোকেন প্রকারের জন্য JWT নির্বাচন করুন এবং তৈরি করুন ক্লিক করুন।
উপরের ডানদিকের কোণায় অ্যাকশন বোতামে ক্লিক করুন। ড্রপ-ডাউন মেনু থেকে জেনারেট ক্লায়েন্ট সিক্রেট নির্বাচন করুন।
আপনার ক্লায়েন্ট আইডি এবং ক্লায়েন্ট সিক্রেট কপি করুন। বন্ধ ক্লিক করুন.
এখন, আপনার কাছে একটি পরিষেবা ব্যবহারকারী রয়েছে, তাদের ক্লায়েন্ট শংসাপত্র সহ।
অনুমোদনে যান। নতুন ক্লিক করুন.
ব্যবহারকারী এবং প্রকল্প নির্বাচন করুন যার জন্য অনুমোদন তৈরি করতে হবে। অবিরত ক্লিক করুন.
আপনি এখানে একটি ভূমিকা নির্বাচন করতে পারেন. বর্তমান ব্যবহারকারীর জন্য সাংবাদিকের ভূমিকা নির্বাচন করুন। সংরক্ষণ করুন ক্লিক করুন.
আপনি দেখতে পাচ্ছেন যে পরিষেবা ব্যবহারকারী লোইস লেন এখন নিউজরুম প্রকল্পে সাংবাদিকের ভূমিকায় রয়েছে৷
এখন, তাদের জ্যেষ্ঠতার স্তর নির্দেশ করতে ব্যবহারকারীর প্রোফাইলে মেটাডেটা যোগ করা যাক। কী হিসাবে 'অভিজ্ঞতা_স্তর' ব্যবহার করুন এবং এর মূল্যের জন্য 'জুনিয়র', 'ইন্টারমিডিয়েট' বা 'সিনিয়র' থেকে বেছে নিন।
যদিও আমরা সাধারণত ধরে নিতে পারি যে এই মেটাডেটাটি HR অ্যাপ্লিকেশন দ্বারা করা একটি API কলের মাধ্যমে সেট করা হয়েছে, সরলতা এবং বোঝার সুবিধার জন্য, আমরা মেটাডেটা সরাসরি কনসোলে সেট করব।
মেটাডেটাতে যান। সম্পাদনা ক্লিক করুন.
অভিজ্ঞতা_স্তরকে কী হিসেবে এবং সিনিয়রকে মান হিসেবে প্রদান করুন। সেভ আইকনে ক্লিক করুন এবং ক্লোজ বোতামে ক্লিক করুন।
ব্যবহারকারীর কাছে এখন তাদের অ্যাকাউন্টের সাথে সম্পর্কিত প্রয়োজনীয় মেটাডেটা রয়েছে৷
আপনি পূর্ববর্তী পদক্ষেপগুলি ব্যবহার করে ডেমো পরীক্ষা করতে বিভিন্ন ভূমিকা এবং অভিজ্ঞতা_স্তরের (মেটাডেটা ব্যবহার করে) সহ আরও কিছু পরিষেবা ব্যবহারকারীকে যুক্ত করতে পারেন।
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); } }); }); }
এখন, যখন একজন ব্যবহারকারী একটি অ্যাক্সেস টোকেনের অনুরোধ করেন, তখন ব্যবহারকারীর ভূমিকা এবং মেটাডেটাকে প্রয়োজনীয় বিন্যাসে রূপান্তরিত করে এবং টোকেনে একটি কাস্টম দাবি হিসাবে যুক্ত করে, অ্যাকশনটি কার্যকর করা হবে। এই কাস্টম দাবি তারপর সূক্ষ্ম ব্যবহারকারী অ্যাক্সেস পরিচালনা করতে তৃতীয় পক্ষের অ্যাপ্লিকেশন দ্বারা ব্যবহার করা যেতে পারে।
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
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 দোভাষী ব্যবহার করছেন।
নিশ্চিত করুন যে আপনি সংগ্রহস্থল ক্লোন করেছেন এবং পূর্বে বর্ণিত প্রয়োজনীয় নির্ভরতা ইনস্টল করেছেন।
একটি অ্যাক্সেস টোকেন তৈরি করতে 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
সফল হলে, এটি আপনার টার্মিনালে একটি অ্যাক্সেস টোকেন প্রিন্ট করবে। এটি সেই টোকেন যা আপনি API-তে আপনার অনুরোধগুলিকে প্রমাণীকরণ করতে ব্যবহার করবেন।
আপনি যদি আগে ফ্লাস্ক API চালু না করে থাকেন, তাহলে প্রকল্প ডিরেক্টরিতে অন্য টার্মিনাল খোলার মাধ্যমে API চালান এবং চালান:
python3 app.py
API সার্ভার এখন চলমান এবং অনুরোধ গ্রহণ করার জন্য প্রস্তুত হওয়া উচিত।
এখন, আপনি API-তে অনুরোধ করতে cURL বা অন্য কোনো HTTP ক্লায়েন্ট (যেমন পোস্টম্যান) ব্যবহার করতে পারেন। কার্ল কমান্ডে your_access_token
প্রতিস্থাপন করতে মনে রাখবেন যে অ্যাক্সেস টোকেন আপনি ধাপ 2 এ প্রাপ্ত করেছেন।
দৃশ্যকল্প 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-এর মতো প্ল্যাটফর্মগুলি জটিল অনুমোদনের চ্যালেঞ্জগুলির জন্য প্রয়োজনীয় সমাধান প্রদান করে।