Role-Based Access Control (RBAC) একটি নিরাপত্তা নীতি যা ব্যবহারকারীদের বিভিন্ন ভূমিকা (Role) প্রদান করে এবং সেই ভূমিকার ভিত্তিতে তাদের অ্যাপ্লিকেশনের কিছু অংশে প্রবেশাধিকার (Access) নির্ধারণ করে। FastAPI-তে RBAC এবং Permission Management কার্যকরভাবে বাস্তবায়ন করা সম্ভব, যা API-এর নিরাপত্তা ব্যবস্থা উন্নত করে এবং বিভিন্ন ব্যবহারকারী এবং ভূমিকা অনুযায়ী অ্যাক্সেস নিয়ন্ত্রণ নিশ্চিত করে।
এখানে আমরা RBAC এবং Permission Management কিভাবে FastAPI তে বাস্তবায়ন করা যায় তা বিস্তারিতভাবে আলোচনা করব।
Step 1: FastAPI তে RBAC কনসেপ্ট
RBAC পদ্ধতিতে, ব্যবহারকারীদের একটি নির্দিষ্ট Role দেওয়া হয়, এবং সেই Role অনুযায়ী তারা অ্যাপ্লিকেশনের বিভিন্ন অংশে প্রবেশ করতে পারে। সাধারণত, কিছু প্রচলিত Role হতে পারে:
- Admin: পুরো অ্যাপ্লিকেশন অ্যাক্সেস আছে।
- User: নির্দিষ্ট কিছু অংশে অ্যাক্সেস।
- Guest: সীমিত অ্যাক্সেস।
উদাহরণ: Role-Based Access Control বাস্তবায়ন
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
app = FastAPI()
# OAuth2PasswordBearer ব্যবহার করা হচ্ছে টোকেন গ্রহণের জন্য
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# Role model
class User(BaseModel):
username: str
role: str
# Dummy database (Users with roles)
fake_users_db = {
"admin_user": {"username": "admin_user", "role": "admin"},
"normal_user": {"username": "normal_user", "role": "user"},
}
# Role-based permission check
def check_role(role: str, token: str = Depends(oauth2_scheme)):
user = fake_users_db.get(token)
if user is None or user['role'] != role:
raise HTTPException(status_code=403, detail="Permission denied")
return user
# Endpoint accessible only by admin
@app.get("/admin/")
def get_admin_data(user: User = Depends(check_role)):
return {"message": f"Hello {user.username}, you have admin access!"}
# Endpoint accessible by any user (admin or normal)
@app.get("/user/")
def get_user_data(user: User = Depends(check_role)):
return {"message": f"Hello {user.username}, you have user access!"}
এখানে:
- check_role ফাংশনটি Role যাচাই করে, এবং Admin অথবা User হিসেবে অ্যাক্সেস প্রদান করে।
fake_users_dbএকটি ডামি ডাটাবেস যা ব্যবহারকারীর নাম এবং তাদের ভূমিকা ধারণ করে।
রিকোয়েস্ট উদাহরণ:
- GET
/admin/: শুধু admin_user অ্যাক্সেস পাবে। - GET
/user/: admin_user এবং normal_user উভয়েই অ্যাক্সেস পাবে।
Step 2: Permissions Management
Permission Management হচ্ছে আরও সূক্ষ্ম নিয়ন্ত্রণ যেখানে একটি নির্দিষ্ট রোলের মধ্যে একাধিক permissions থাকতে পারে। উদাহরণস্বরূপ:
- Admin রোলের জন্য সমস্ত অ্যাক্সেস (CRUD অপারেশন)।
- User রোলের জন্য শুধু
readঅ্যাক্সেস। - Guest রোলের জন্য শুধুমাত্র
read-onlyঅ্যাক্সেস।
উদাহরণ: Permission Management
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from typing import List
app = FastAPI()
# OAuth2PasswordBearer ব্যবহার করা হচ্ছে টোকেন গ্রহণের জন্য
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# User model
class User(BaseModel):
username: str
role: str
# Dummy database
fake_users_db = {
"admin_user": {"username": "admin_user", "role": "admin", "permissions": ["create", "read", "update", "delete"]},
"normal_user": {"username": "normal_user", "role": "user", "permissions": ["read"]},
"guest_user": {"username": "guest_user", "role": "guest", "permissions": ["read"]},
}
# Check permission function
def check_permission(permission: str, token: str = Depends(oauth2_scheme)):
user = fake_users_db.get(token)
if user is None or permission not in user['permissions']:
raise HTTPException(status_code=403, detail="Permission denied")
return user
# Endpoint where user needs 'read' permission
@app.get("/data/read/")
def read_data(user: User = Depends(check_permission)):
return {"message": f"Hello {user.username}, you have read access!"}
# Endpoint where user needs 'create' permission
@app.post("/data/create/")
def create_data(user: User = Depends(check_permission)):
return {"message": f"Hello {user.username}, you have create access!"}
এখানে:
- check_permission ফাংশনটি
permissionযাচাই করে, এবং read, create, update, delete অনুমতি ভিত্তিতে ব্যবহারকারীকে অ্যাক্সেস দেয়। - fake_users_db তে ব্যবহারকারীর permissions রয়েছে, যেমন "read", "create", "update", "delete"।
রিকোয়েস্ট উদাহরণ:
- GET
/data/read/: শুধুমাত্র admin_user, normal_user, এবং guest_user এর জন্য read permission প্রয়োজন। - POST
/data/create/: শুধুমাত্র admin_user এর জন্য create permission প্রয়োজন।
Step 3: JWT (JSON Web Token) ব্যবহার করে RBAC এবং Permission Management
JWT (JSON Web Token) ব্যবহার করে Authentication এবং Authorization ব্যবস্থা করা হয়। এটি একটি সাধারণ পদ্ধতি যেখানে ব্যবহারকারী প্রথমে লগইন করে একটি টোকেন পান এবং পরবর্তী রিকোয়েস্টে সেই টোকেনটি প্রেরণ করেন।
উদাহরণ: JWT ব্যবহার করে RBAC এবং Permission Management
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
import jwt
from datetime import datetime, timedelta
app = FastAPI()
# OAuth2PasswordBearer ব্যবহার করা হচ্ছে টোকেন গ্রহণের জন্য
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# User model
class User(BaseModel):
username: str
role: str
# JWT Secret key
SECRET_KEY = "mysecretkey"
# Dummy database (Users with roles)
fake_users_db = {
"admin_user": {"username": "admin_user", "role": "admin", "permissions": ["create", "read", "update", "delete"]},
"normal_user": {"username": "normal_user", "role": "user", "permissions": ["read"]},
}
# JWT Token Generation
def create_access_token(username: str, role: str):
expiration = datetime.utcnow() + timedelta(hours=1)
payload = {"sub": username, "role": role, "exp": expiration}
return jwt.encode(payload, SECRET_KEY, algorithm="HS256")
# Token Validation
def decode_token(token: str):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return payload
except jwt.ExpiredSignatureError:
raise HTTPException(status_code=401, detail="Token has expired")
except jwt.InvalidTokenError:
raise HTTPException(status_code=401, detail="Invalid token")
# Permission Check function using decoded JWT
def check_permission(permission: str, token: str = Depends(oauth2_scheme)):
decoded_token = decode_token(token)
user = fake_users_db.get(decoded_token["sub"])
if user is None or permission not in user['permissions']:
raise HTTPException(status_code=403, detail="Permission denied")
return user
# Endpoint with RBAC and Permissions
@app.get("/data/read/")
def read_data(user: User = Depends(check_permission)):
return {"message": f"Hello {user.username}, you have read access!"}
@app.post("/data/create/")
def create_data(user: User = Depends(check_permission)):
return {"message": f"Hello {user.username}, you have create access!"}
এখানে:
- JWT Token তৈরি করার জন্য
create_access_tokenফাংশন ব্যবহার করা হয়েছে। - Token যাচাই করা হচ্ছে
decode_tokenফাংশনের মাধ্যমে এবং কাস্টম permission check করা হচ্ছে।
রিকোয়েস্ট উদাহরণ:
- POST
/tokenরিকোয়েস্টের মাধ্যমে JWT টোকেন পেতে হবে, পরে সেই টোকেন সহ GET/data/read/বা POST/data/create/রিকোয়েস্ট পাঠানো হবে।
FastAPI-তে Role-Based Access Control (RBAC) এবং Permission Management বাস্তবায়ন করা অত্যন্ত সহজ এবং শক্তিশালী। আপনি OAuth2, JWT, এবং Permission Check ফাংশন ব্যবহার করে API-এর নিরাপত্তা ব্যবস্থা উন্নত করতে পারেন। RBAC এবং Permission Management কৌশলগুলি API-এর বিভিন্ন ব্যবহারকারীর ভূমিকা এবং তাদের অ্যাক্সেস কনট্রোল নিশ্চিত করতে সাহায্য করে, যা একটি সুরক্ষিত এবং কার্যকর API তৈরি করার জন্য অপরিহার্য।
Read more