CherryPy তে Authentication এবং Authorization ব্যবস্থাপনা ওয়েব অ্যাপ্লিকেশনগুলোর নিরাপত্তা নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে। Authentication ব্যবস্থার মাধ্যমে ব্যবহারকারীদের পরিচয় যাচাই করা হয়, এবং Authorization ব্যবস্থার মাধ্যমে নিশ্চিত করা হয় যে ব্যবহারকারী কোন রিসোর্স বা অ্যাকশন অ্যাক্সেস করতে পারবে।
এখানে CherryPy তে Authentication এবং Authorization ব্যবস্থা কিভাবে কার্যকরভাবে বাস্তবায়ন করা যায় তা দেখানো হবে।
Authentication (ব্যবহারকারী পরিচয় যাচাই)
Authentication হলো একটি প্রক্রিয়া যার মাধ্যমে একটি সিস্টেম ব্যবহারকারীর পরিচয় যাচাই করে, সাধারণত ইউজারনেম এবং পাসওয়ার্ড এর মাধ্যমে। CherryPy তে, আপনি HTTP Basic Authentication বা কাস্টম Authentication সিস্টেম ব্যবহার করতে পারেন।
উদাহরণ: HTTP Basic Authentication
CherryPy তে Basic Authentication ব্যবহারের জন্য আপনাকে cherrypy.tools.auth_basic ব্যবহার করতে হবে।
- Authentication Tool Setup
import cherrypy
from cherrypy.lib import auth_basic
# ডিফল্ট ইউজারনেম এবং পাসওয়ার্ড
USER_CREDENTIALS = {
'admin': 'password123',
'guest': 'guest123'
}
def check_credentials(realm, username, password):
"""ইউজারনেম এবং পাসওয়ার্ড যাচাই করার জন্য একটি ফাংশন"""
if username in USER_CREDENTIALS and USER_CREDENTIALS[username] == password:
return True
return False
class MyApp:
@cherrypy.expose
@cherrypy.tools.auth_basic(check_credentials)
def index(self):
return "স্বাগতম, আপনি সফলভাবে লগইন করেছেন!"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
check_credentials: এই ফাংশনটি ইউজারনেম এবং পাসওয়ার্ড যাচাই করে। যদি সঠিক থাকে, তবে লগইন সফল হয়।@cherrypy.tools.auth_basic(check_credentials): এই টুলটিindexমেথডে Basic Authentication প্রয়োগ করে, যেখানে ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হয়।
এখন, ব্রাউজারে http://127.0.0.1:8080 এ গেলে, আপনি একটি পপ-আপ দেখতে পাবেন যেখানে ইউজারনেম এবং পাসওয়ার্ড প্রদান করতে হবে।
Authorization (অথরাইজেশন)
Authorization হলো একটি প্রক্রিয়া যার মাধ্যমে সিস্টেম এটি যাচাই করে যে, ব্যবহারকারী একটি নির্দিষ্ট রিসোর্স বা অ্যাকশন অ্যাক্সেস করার অনুমতি পাবে কিনা। CherryPy তে আপনি Role-based Authorization সিস্টেম তৈরি করতে পারেন।
উদাহরণ: Role-based Authorization
ধরা যাক, আমরা দুটি ভিন্ন রোল তৈরি করেছি - admin এবং guest। শুধুমাত্র admin রোলের ব্যবহারকারীরা একটি নির্দিষ্ট পৃষ্ঠায় অ্যাক্সেস পাবে।
import cherrypy
from cherrypy.lib import auth_basic
# ডিফল্ট ইউজারনেম, পাসওয়ার্ড এবং রোল
USER_CREDENTIALS = {
'admin': ('password123', 'admin'),
'guest': ('guest123', 'guest')
}
def check_credentials(realm, username, password):
"""ইউজারনেম, পাসওয়ার্ড এবং রোল যাচাই করার জন্য একটি ফাংশন"""
if username in USER_CREDENTIALS and USER_CREDENTIALS[username][0] == password:
return USER_CREDENTIALS[username][1] # রোল রিটার্ন
return False
class MyApp:
@cherrypy.expose
@cherrypy.tools.auth_basic(check_credentials)
def index(self):
return "স্বাগতম, আপনি সফলভাবে লগইন করেছেন!"
@cherrypy.expose
@cherrypy.tools.auth_basic(check_credentials)
def admin_page(self):
# শুধুমাত্র admin রোলের জন্য অ্যাক্সেস
if cherrypy.request.login != 'admin':
raise cherrypy.HTTPError(403, "আপনার এই পৃষ্ঠার অ্যাক্সেস নেই।")
return "এটি শুধুমাত্র অ্যাডমিন পেজ!"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
check_credentials: এই ফাংশনটি ইউজারনেম, পাসওয়ার্ড এবং রোল যাচাই করে। রোল যদিadminহয়, তবেadmin_pageপেজটি অ্যাক্সেস করা যাবে।- Authorization:
admin_pageমেথডে আমরা নিশ্চিত করেছি যে, শুধু admin রোলের ব্যবহারকারীই এই পৃষ্ঠায় অ্যাক্সেস করতে পারবে, অন্যথায় 403 Forbidden ত্রুটি রিটার্ন করা হবে।
Token-based Authentication (JWT)
CherryPy তে আপনি JWT (JSON Web Tokens) ব্যবহার করে Token-based Authentication সিস্টেমও তৈরি করতে পারেন। এখানে আপনার ব্যবহারকারীদের লগইন করার পর একটি Token দেওয়া হবে, যা তাদের সেশন পরিচিতি বজায় রাখবে।
উদাহরণ: Token-based Authentication
import cherrypy
import jwt
import datetime
SECRET_KEY = 'mysecretkey'
def generate_token(username):
"""টোকেন জেনারেট করার ফাংশন"""
expiration_time = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
token = jwt.encode({'username': username, 'exp': expiration_time}, SECRET_KEY, algorithm='HS256')
return token
def decode_token(token):
"""টোকেন ডিকোড করার ফাংশন"""
try:
decoded_token = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
return decoded_token['username']
except jwt.ExpiredSignatureError:
raise cherrypy.HTTPError(401, "টোকেনের মেয়াদ শেষ হয়েছে।")
except jwt.InvalidTokenError:
raise cherrypy.HTTPError(401, "অকার্যকর টোকেন।")
class MyApp:
@cherrypy.expose
def login(self, username, password):
# এখানে সিম্পল চেক করা হচ্ছে
if username == 'admin' and password == 'password123':
token = generate_token(username)
return f"লগইন সফল! টোকেন: {token}"
return "অপরিচিত ইউজারনেম বা পাসওয়ার্ড।"
@cherrypy.expose
def protected_page(self, token):
username = decode_token(token)
return f"স্বাগতম, {username}! আপনি সফলভাবে প্রটেক্টেড পেজে অ্যাক্সেস করেছেন।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
generate_token: ব্যবহারকারীর নাম এবং মেয়াদ সহ একটি JWT টোকেন তৈরি করে।decode_token: টোকেন ডিকোড করে এবং যাচাই করে, এটি বৈধ ও মেয়াদী কিনা।- Protected Route:
protected_pageমেথডে টোকেন যাচাই করে ব্যবহারকারীকে পেজ অ্যাক্সেস দেওয়া হয়।
CherryPy তে Authentication এবং Authorization ব্যবস্থাপনা সিস্টেম তৈরি করা বেশ সহজ। আপনি Basic Authentication, Role-based Authorization এবং Token-based Authentication (JWT) এর মতো বিভিন্ন সিকিউরিটি পদ্ধতি ব্যবহার করতে পারেন। CherryPy এ এই ধরনের সিস্টেম একত্রিত করার মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করতে পারবেন এবং সঠিকভাবে ব্যবহারকারীদের অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন।
CherryPy তে Authentication Management ব্যবস্থাপনা একটি গুরুত্বপূর্ণ অংশ, যেখানে অ্যাপ্লিকেশন ইউজারদের লগইন, লগআউট এবং অথেন্টিকেশন প্রক্রিয়া পরিচালনা করতে সক্ষম হয়। CherryPy এ বিভিন্ন পদ্ধতির মাধ্যমে ইউজার অথেন্টিকেশন বাস্তবায়ন করা যায়, যেমন সেশন ব্যবহার করে লগইন সিস্টেম তৈরি, কুকি ব্যবহার করে অথেন্টিকেশন নিশ্চিত করা, অথবা অন্যান্য নিরাপত্তা ফিচার যেমন HTTP Basic Authentication প্রয়োগ করা।
এখানে, আমরা CherryPy তে Authentication Management সেটআপ করার জন্য বিভিন্ন পদ্ধতি আলোচনা করব।
১. সেশন ব্যবহার করে Authentication
CherryPy তে session ব্যবহারের মাধ্যমে লগইন সিস্টেম তৈরি করা সহজ। cherrypy.session ব্যবহারের মাধ্যমে ইউজারের লগইন তথ্য সংরক্ষণ করা এবং নিরাপদভাবে অ্যাক্সেস করা সম্ভব।
উদাহরণ: সেশন ব্যবহার করে Authentication
import cherrypy
class AuthApp:
@cherrypy.expose
def index(self):
if 'logged_in' in cherrypy.session and cherrypy.session['logged_in'] == True:
return "স্বাগতম, আপনি লগইন করেছেন!"
else:
return "আপনি লগইন করেননি। <a href='/login'>লগইন করুন</a>"
@cherrypy.expose
def login(self):
return '''
<form method="post" action="/login">
ইউজারনেম: <input type="text" name="username"><br>
পাসওয়ার্ড: <input type="password" name="password"><br>
<input type="submit" value="লগইন">
</form>
'''
@cherrypy.expose
def login(self, username, password):
# ইউজারনেম এবং পাসওয়ার্ড যাচাই
if username == "admin" and password == "password123":
cherrypy.session['logged_in'] = True
return "লগইন সফল। <a href='/'>হোম পেজে ফিরে যান</a>"
else:
return "অবৈধ ইউজারনেম বা পাসওয়ার্ড। <a href='/login'>আবার চেষ্টা করুন</a>"
@cherrypy.expose
def logout(self):
cherrypy.session['logged_in'] = False
return "লগআউট সফল। <a href='/'>হোম পেজে ফিরে যান</a>"
if __name__ == '__main__':
cherrypy.quickstart(AuthApp(), '/', {'/': {'tools.sessions.on': True}})
এই উদাহরণে:
indexমেথডটি সেশনেlogged_inচেক করে ইউজারের লগইন স্ট্যাটাস দেখায়।loginমেথডে ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হয়।logoutমেথডটি সেশন থেকে লগআউট করে এবং ইউজারকে হোম পেজে রিডিরেক্ট করে।
২. HTTP Basic Authentication
CherryPy তে HTTP Basic Authentication ব্যবহার করে ইউজারের অথেন্টিকেশন পরিচালনা করা যায়। এটি সার্ভার থেকে ইউজারকে অথেন্টিকেশন পপ-আপ প্রদর্শন করে, যা ইউজারের ইউজারনেম এবং পাসওয়ার্ড গ্রহণ করে।
উদাহরণ: HTTP Basic Authentication
import cherrypy
from cherrypy.lib import auth
class AuthApp:
@cherrypy.expose
@cherrypy.tools.auth_basic(realm="Private Area", check=auth.basic_check)
def index(self):
return "স্বাগতম, আপনি সফলভাবে লগইন করেছেন!"
if __name__ == '__main__':
cherrypy.quickstart(AuthApp())
এই উদাহরণে:
@cherrypy.tools.auth_basic: এই ডেকোরেটরটি HTTP Basic Authentication চালু করে, যা ইউজারকে ইউজারনেম এবং পাসওয়ার্ড দিয়ে অথেন্টিকেশন করতে বলবে।auth.basic_check: ইউজারের ইউজারনেম এবং পাসওয়ার্ড যাচাই করা হয়।
৩. কুকি ব্যবহার করে Authentication
CherryPy তে কুকি ব্যবহার করে ইউজারের লগইন তথ্য সঞ্চয় করা যায়, যাতে ইউজারের লগইন সেশন দীর্ঘ সময় পর্যন্ত সক্রিয় থাকে। কুকি ব্যবহারের মাধ্যমে আপনি ইউজারের পছন্দ এবং অথেন্টিকেশন তথ্য সঞ্চয় করতে পারেন।
উদাহরণ: কুকি ব্যবহার করে Authentication
import cherrypy
class AuthApp:
@cherrypy.expose
def index(self):
if 'username' in cherrypy.request.cookies:
return f"স্বাগতম {cherrypy.request.cookies['username']}! আপনি সফলভাবে লগইন করেছেন।"
else:
return "আপনি লগইন করেননি। <a href='/login'>লগইন করুন</a>"
@cherrypy.expose
def login(self, username, password):
# ইউজারনেম এবং পাসওয়ার্ড যাচাই
if username == "admin" and password == "password123":
cherrypy.response.cookie['username'] = username
return f"লগইন সফল। স্বাগতম {username}! <a href='/'>হোম পেজে ফিরে যান</a>"
else:
return "অবৈধ ইউজারনেম বা পাসওয়ার্ড। <a href='/login'>আবার চেষ্টা করুন</a>"
@cherrypy.expose
def logout(self):
cherrypy.response.cookie['username'] = ''
return "লগআউট সফল। <a href='/'>হোম পেজে ফিরে যান</a>"
if __name__ == '__main__':
cherrypy.quickstart(AuthApp())
এখানে:
cherrypy.response.cookie['username']: ইউজারনেম কুকি হিসেবে সেট করা হয় যখন ইউজার লগইন করে।cherrypy.request.cookies['username']: কুকি থেকে ইউজারনেম নিয়ে আসে এবং ইউজারকে স্বাগতম জানায়।
৪. Custom Authentication (কাস্টম অথেন্টিকেশন)
CherryPy তে আপনি কাস্টম অথেন্টিকেশন মেকানিজম তৈরি করতে পারেন, যেমন ডাটাবেসের মাধ্যমে ইউজারের তথ্য যাচাই করা। একটি সাধারণ কাস্টম অথেন্টিকেশন সিস্টেম তৈরি করার জন্য আপনি check ফাংশন ব্যবহার করতে পারেন, যা ইউজারের পাসওয়ার্ড যাচাই করে।
উদাহরণ: কাস্টম অথেন্টিকেশন
import cherrypy
def check_user(username, password):
# ইউজারনেম এবং পাসওয়ার্ড যাচাই
if username == "admin" and password == "password123":
return True
return False
class AuthApp:
@cherrypy.expose
def index(self):
return "স্বাগতম! আপনি সফলভাবে লগইন করেছেন।"
@cherrypy.expose
def login(self, username, password):
if check_user(username, password):
return "লগইন সফল। <a href='/'>হোম পেজে ফিরে যান</a>"
else:
return "অবৈধ ইউজারনেম বা পাসওয়ার্ড। <a href='/login'>আবার চেষ্টা করুন</a>"
if __name__ == '__main__':
cherrypy.quickstart(AuthApp())
এখানে, check_user ফাংশনটি ইউজারের ইউজারনেম এবং পাসওয়ার্ড যাচাই করে।
CherryPy তে Authentication Management অনেক সহজ এবং নমনীয়। আপনি সেশন, HTTP Basic Authentication, কুকি অথবা কাস্টম অথেন্টিকেশন পদ্ধতির মাধ্যমে নিরাপদ লগইন সিস্টেম তৈরি করতে পারেন। CherryPy তে এসব ফিচার ব্যবহারের মাধ্যমে আপনি আপনার ওয়েব অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করতে পারবেন।
CherryPy-তে ওয়েব অ্যাপ্লিকেশন তৈরি করার সময় Authentication ব্যবহার করা হয় যাতে ইউজারদের প্রবেশাধিকার নিয়ন্ত্রণ করা যায়। CherryPy দুই ধরনের অথেনটিকেশন সিস্টেম সমর্থন করে: Basic Authentication এবং Digest Authentication। এই দুটি সিস্টেমই ওয়েব অ্যাপ্লিকেশনে নিরাপত্তা ব্যবস্থার জন্য ব্যবহৃত হয়।
১. Basic Authentication
Basic Authentication একটি সরল অথেনটিকেশন পদ্ধতি যেখানে ইউজারনেম এবং পাসওয়ার্ড HTTP হেডারে পাঠানো হয়। এটি সহজ, তবে নিরাপত্তা জন্য SSL/TLS ব্যবহার করা প্রয়োজন, কারণ ডেটা সরাসরি পাঠানো হয়।
Basic Authentication উদাহরণ
CherryPy তে Basic Authentication ব্যবহার করতে হলে cherrypy.tools.auth_basic টুল ব্যবহার করতে হবে।
উদাহরণ কোড:
import cherrypy
from cherrypy.lib import auth_basic
# ইউজারনেম এবং পাসওয়ার্ড সংরক্ষণের জন্য
def check_password(realm, username, password):
users = {
"admin": "password123",
"guest": "guestpassword"
}
return users.get(username) == password
class MyApp:
@cherrypy.expose
@cherrypy.tools.auth_basic(check_password) # Basic authentication প্রয়োগ
def index(self):
return "স্বাগতম CherryPy অ্যাপে! আপনি সফলভাবে লগইন করেছেন।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
কোড ব্যাখ্যা:
check_passwordফাংশনটি ইউজারনেম এবং পাসওয়ার্ড যাচাই করে। যদি তারা সঠিক হয়, তবে লগইন অনুমোদন করা হয়।@cherrypy.tools.auth_basic(check_password): এই ডেকোরেটর Basic Authentication প্রয়োগ করে।- এই উদাহরণে, ইউজারদের জন্য ইউজারনেম এবং পাসওয়ার্ড তৈরি করা হয়েছে, যা শুধুমাত্র ইউজারনেম এবং পাসওয়ার্ড মিলিয়ে যাচাই করবে।
২. Digest Authentication
Digest Authentication একটি বেশি নিরাপদ অথেনটিকেশন পদ্ধতি, যেখানে ইউজারনেম এবং পাসওয়ার্ডের পরিবর্তে একটি হ্যাশ পাঠানো হয়। এটি Basic Authentication থেকে নিরাপদ, কারণ পাসওয়ার্ড কখনো সরাসরি পাঠানো হয় না। তবে এটি SSL/TLS সমর্থন করতে পারে।
Digest Authentication উদাহরণ
CherryPy তে Digest Authentication ব্যবহার করতে হলে cherrypy.lib.auth_digest টুল ব্যবহার করতে হয়।
উদাহরণ কোড:
import cherrypy
from cherrypy.lib import auth_digest
# ইউজারনেম এবং পাসওয়ার্ড সংরক্ষণের জন্য
def check_password(realm, username, password):
users = {
"admin": "password123",
"guest": "guestpassword"
}
return users.get(username) == password
class MyApp:
@cherrypy.expose
@cherrypy.tools.auth_digest(check_password) # Digest authentication প্রয়োগ
def index(self):
return "স্বাগতম CherryPy অ্যাপে! আপনি সফলভাবে লগইন করেছেন।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
কোড ব্যাখ্যা:
check_password: ইউজারনেম এবং পাসওয়ার্ড যাচাই করার জন্য ব্যবহার করা হয়।@cherrypy.tools.auth_digest(check_password): Digest Authentication প্রয়োগ করার জন্য ব্যবহার করা হয়।- Digest Authentication এ, ইউজারনেম এবং পাসওয়ার্ডের হ্যাশ পাঠানো হয়, যা সার্ভার যাচাই করে।
Basic এবং Digest Authentication এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | Basic Authentication | Digest Authentication |
|---|---|---|
| নিরাপত্তা | কম (পাসওয়ার্ড সরাসরি পাঠানো হয়) | বেশি (পাসওয়ার্ড হ্যাশ পাঠানো হয়) |
| পদ্ধতি | HTTP হেডারে ইউজারনেম এবং পাসওয়ার্ড পাঠানো | পাসওয়ার্ডের হ্যাশ পাঠানো |
| SSL/TLS প্রয়োজন | হ্যাঁ, নিরাপত্তার জন্য SSL/TLS প্রয়োজন | না, তবে SSL/TLS আরও নিরাপদ |
CherryPy এর সাথে Basic ও Digest Authentication ব্যবহারের সুবিধা
- সহজ বাস্তবায়ন: CherryPy-তে এই অথেনটিকেশনগুলো সহজে প্রয়োগ করা যায়।
- নিরাপত্তা বৃদ্ধি: Digest Authentication এর মাধ্যমে আপনি পাসওয়ার্ডের হ্যাশ পাঠিয়ে আরও নিরাপত্তা প্রদান করতে পারেন।
- ব্যবহারকারী পরিচালনা: Basic এবং Digest Authentication উভয়ই দ্রুত ইউজার অ্যাক্সেস ম্যানেজমেন্ট সক্ষম করে।
CherryPy তে Basic এবং Digest Authentication নিরাপদে এবং সহজভাবে ব্যবহারকারীদের প্রমাণীকরণের জন্য ব্যবহার করা যেতে পারে। আপনি যে কোনো একটি ব্যবহার করে আপনার ওয়েব অ্যাপ্লিকেশন নিরাপদ করতে পারেন। তবে Digest Authentication তুলনামূলকভাবে আরও নিরাপদ, কারণ এতে পাসওয়ার্ড সরাসরি পাঠানো হয় না, হ্যাশ পাঠানো হয়।
CherryPy ব্যবহার করে আপনি সহজেই একটি Custom Authentication System তৈরি করতে পারেন। এই সিস্টেমের মাধ্যমে আপনি ব্যবহারকারীদের লগইন, সাইনআপ, এবং তাদের সেশন পরিচালনা করতে পারবেন। এই টিউটোরিয়ালে আমরা একটি সাধারণ username এবং password ভিত্তিক লগইন সিস্টেম তৈরি করবো।
1. Authentication System এর মৌলিক ধারণা
একটি সাধারণ Authentication System ব্যবহারকারীদের পরিচয় যাচাই করার জন্য ব্যবহৃত হয়, যেখানে:
- Login: ব্যবহারকারী একটি ইউজারনেম এবং পাসওয়ার্ড দিয়ে সিস্টেমে প্রবেশ করে।
- Session Management: লগইন হওয়া ব্যবহারকারীর জন্য সেশন তৈরি করা হয় যাতে তারা লগইন অবস্থায় থাকে।
2. CherryPy এর সাথে Custom Authentication
এই উদাহরণে আমরা:
- লগইন ফর্ম তৈরি করবো।
- সঠিক ইউজারনেম এবং পাসওয়ার্ড যাচাই করবো।
- একটি সেশন তৈরি করবো।
- সেশন যাচাই করে ব্যবহারকারীর এক্সেস কন্ট্রোল করবো।
উদাহরণ: Custom Authentication System
import cherrypy
import os
import json
# Dummy user data (In a real app, you'd use a database)
users_db = {
"admin": {"password": "admin123", "role": "admin"},
"user1": {"password": "user123", "role": "user"}
}
class AuthApp:
def __init__(self):
self.session = None # Store session details
def check_authentication(self):
# Check if a session exists
if not self.session or "username" not in self.session:
return False
return True
@cherrypy.expose
def index(self):
if not self.check_authentication():
return "You must be logged in to view this page. <a href='/login'>Login</a>"
return f"Welcome, {self.session['username']}! <a href='/logout'>Logout</a>"
@cherrypy.expose
def login(self, username=None, password=None):
if username and password:
# Check if user exists in the database
if username in users_db and users_db[username]["password"] == password:
self.session = {"username": username, "role": users_db[username]["role"]}
return f"Login successful! Welcome, {username}. <a href='/'>Go to home</a>"
else:
return "Invalid credentials! <a href='/login'>Try again</a>"
# Render login form
return '''
<html>
<body>
<form method="get" action="/login">
Username: <input type="text" name="username"><br>
Password: <input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
'''
@cherrypy.expose
def logout(self):
self.session = None
return "Logged out successfully! <a href='/login'>Login again</a>"
if __name__ == '__main__':
cherrypy.config.update({
'server.socket_host': '127.0.0.1',
'server.socket_port': 8080,
})
cherrypy.quickstart(AuthApp())
কোড ব্যাখ্যা:
- Dummy User Database:
users_dbdictionary ব্যবহার করে ইউজারনেম এবং পাসওয়ার্ড সংরক্ষণ করা হয়েছে। একটি রিয়েল অ্যাপ্লিকেশনে, এই তথ্য একটি ডাটাবেসে সংরক্ষিত থাকে। - Session Management: ব্যবহারকারী সফলভাবে লগইন করলে, তাদের ইউজারনেম এবং রোল সেশন ভেরিয়েবলে সংরক্ষণ করা হয়। যদি সেশন না থাকে, তবে ব্যবহারকারীকে লগইন করতে বলা হয়।
indexমেথড: এটি হোম পেজ হিসেবে কাজ করে। যদি সেশন না থাকে, তবে ব্যবহারকারীকে লগইন পেজে রিডিরেক্ট করা হয়।loginমেথড: এখানে ব্যবহারকারী তাদের ইউজারনেম এবং পাসওয়ার্ড প্রদান করতে পারেন। যদি তারা সঠিক ইউজারনেম এবং পাসওয়ার্ড দেন, তবে সেশন তৈরি হয় এবং লগইন সফল হয়। অন্যথায়, ভুল তথ্য দেওয়ার জন্য একটি ত্রুটি বার্তা প্রদর্শিত হয়।logoutমেথড: এটি সেশন মুছে ফেলে, যার ফলে ব্যবহারকারী লগআউট হয়ে যায়।
3. সেশন সুরক্ষা
CherryPy তে সেশন পরিচালনা করার জন্য cherrypy.tools.sessions টুলস ব্যবহার করা যায়। এখানে সেশন ব্যবস্থাপনার জন্য cookie-based sessions ব্যবহৃত হয়েছে।
Session Configuration:
cherrypy.config.update({
'tools.sessions.on': True,
'tools.sessions.timeout': 60, # Timeout after 60 seconds of inactivity
})
4. পাসওয়ার্ড সুরক্ষা
এই উদাহরণে পাসওয়ার্ড সোজা প্লেইন টেক্সট আকারে সংরক্ষিত হয়েছে, যা রিয়েল অ্যাপ্লিকেশনে নিরাপদ নয়। বাস্তব জীবনে, পাসওয়ার্ড ক্রিপ্টোগ্রাফিক পদ্ধতিতে সংরক্ষণ করা উচিত। এর জন্য পাসওয়ার্ড hashing প্রযুক্তি যেমন bcrypt বা hashlib ব্যবহার করা যায়।
import hashlib
def hash_password(password):
return hashlib.sha256(password.encode('utf-8')).hexdigest()
# Example
hashed_password = hash_password("admin123")
5. অ্যাক্সেস কন্ট্রোল (Role-based Access Control)
চেরিপাইয়ের সাথে রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোল (RBAC) ব্যবস্থাও বাস্তবায়ন করা সম্ভব। উদাহরণস্বরূপ, আপনি চেক করতে পারেন যে, লগইন করা ব্যবহারকারী admin রোলের সদস্য কিনা এবং সেই অনুযায়ী অ্যাক্সেস প্রদান করতে পারেন।
def check_admin(self):
if self.session['role'] != 'admin':
return False
return True
CherryPy দিয়ে একটি Custom Authentication System তৈরি করা খুবই সহজ এবং এর মাধ্যমে আপনি লগইন, সাইনআপ এবং সেশন ম্যানেজমেন্টের জন্য একটি শক্তিশালী সিস্টেম তৈরি করতে পারেন। এই সিস্টেমের মাধ্যমে আপনি ব্যবহারকারীদের প্রমাণীকরণ এবং অ্যাক্সেস কন্ট্রোল সহজে পরিচালনা করতে পারবেন। তবে, নিরাপত্তার জন্য বাস্তব অ্যাপ্লিকেশনগুলিতে পাসওয়ার্ড হ্যাশিং এবং SSL এর মতো নিরাপত্তা ব্যবস্থা ব্যবহার করা উচিত।
CherryPy তে Role-based Authorization (রোল-ভিত্তিক অনুমোদন) এবং Access Control (অ্যাক্সেস কন্ট্রোল) বাস্তবায়ন করা খুবই গুরুত্বপূর্ণ, বিশেষত ওয়েব অ্যাপ্লিকেশনে ব্যবহারকারীদের বিভিন্ন স্তরের অ্যাক্সেস প্রদান করতে। এই ধারণা অনুসরণ করে, ব্যবহারকারীদের বিভিন্ন রোলের ভিত্তিতে অ্যাক্সেস কন্ট্রোল সেট করা হয়, যেমন অ্যাডমিন, ইউজার, গেস্ট ইত্যাদি। CherryPy এ সহজেই এই ধরনের অনুমোদন ব্যবস্থা তৈরি করা সম্ভব।
Role-based Authorization (রোল-ভিত্তিক অনুমোদন)
Role-based Authorization একটি নিরাপত্তা কৌশল, যেখানে ব্যবহারকারীদের নির্দিষ্ট রোল বা পদের ভিত্তিতে তাদের অ্যাপ্লিকেশনে অ্যাক্সেস দেওয়া হয়। সাধারণত, এটি authentication (ব্যবহারকারীর পরিচয় যাচাই) এবং authorization (অ্যাক্সেস অনুমোদন) এর মধ্যে ব্যবধান তৈরি করে।
CherryPy তে Role-based Authorization বাস্তবায়ন
CherryPy তে রোল-ভিত্তিক অ্যাক্সেস কন্ট্রোল বাস্তবায়ন করতে cherrypy.tools এবং cherrypy.request টুলস ব্যবহার করা যায়।
উদাহরণ: রোল-ভিত্তিক অনুমোদন
- ব্যবহারকারী মডেল তৈরি করা:
import cherrypy
class User:
def __init__(self, username, password, role):
self.username = username
self.password = password
self.role = role # 'admin', 'user', 'guest'
- Authentication এবং Authorization টুলস:
class AuthApp:
def __init__(self):
# কিছু ডেমো ব্যবহারকারী
self.users = [
User("admin", "adminpass", "admin"),
User("user", "userpass", "user"),
User("guest", "guestpass", "guest"),
]
def check_credentials(self, username, password):
for user in self.users:
if user.username == username and user.password == password:
return user
return None
def check_role(self, user, required_role):
if user.role == required_role:
return True
return False
@cherrypy.expose
def index(self):
return '''<html>
<body>
<h2>লগইন ফর্ম</h2>
<form action="/login" method="post">
<label for="username">ইউজারনেম:</label><br>
<input type="text" name="username" required><br><br>
<label for="password">পাসওয়ার্ড:</label><br>
<input type="password" name="password" required><br><br>
<input type="submit" value="লগইন">
</form>
</body>
</html>'''
@cherrypy.expose
def login(self, username, password):
user = self.check_credentials(username, password)
if user:
cherrypy.session['user'] = user.username
cherrypy.session['role'] = user.role
return f"স্বাগতম, {user.username}! আপনি '{user.role}' রোলের অধিকারী।<br><a href='/dashboard'>ড্যাশবোর্ড</a>"
else:
return "অভ্যন্তরীণ লগইন ত্রুটি! ভুল ইউজারনেম অথবা পাসওয়ার্ড।<br><a href='/'>পুনরায় চেষ্টা করুন</a>"
@cherrypy.expose
def dashboard(self):
if 'role' not in cherrypy.session:
return "আপনি লগইন করেননি! <br><a href='/'>লগইন করুন</a>"
role = cherrypy.session['role']
if role == "admin":
return "এটি অ্যাডমিন ড্যাশবোর্ড। আপনি সমস্ত অ্যাক্সেস পেয়েছেন।"
elif role == "user":
return "এটি ইউজার ড্যাশবোর্ড। কিছু সীমিত অ্যাক্সেস রয়েছে।"
else:
return "এটি গেস্ট ড্যাশবোর্ড। শুধুমাত্র পড়ার জন্য অ্যাক্সেস।"
if __name__ == '__main__':
cherrypy.quickstart(AuthApp())
কোড ব্যাখ্যা:
check_credentials: ইউজারনেম এবং পাসওয়ার্ড যাচাই করার জন্য একটি ফাংশন।check_role: ইউজারের রোল যাচাই করে যে তারা অনুমোদিত কি না।login: লগইন ফর্মে দেওয়া ইউজারনেম এবং পাসওয়ার্ড যাচাই করে, এবং সেশন তৈরি করে।dashboard: ড্যাশবোর্ডে রোল অনুসারে অ্যাক্সেস প্রদান করে। অ্যাডমিনদের সবকিছু দেখানো হয়, ইউজারদের কিছু সীমিত অ্যাক্সেস দেওয়া হয়, এবং গেস্টদের শুধুমাত্র পড়ার অধিকার দেওয়া হয়।
Access Control (অ্যাক্সেস কন্ট্রোল)
CherryPy তে অ্যাক্সেস কন্ট্রোল একটি গুরুত্বপূর্ণ বিষয়, যা বিভিন্ন পাথের জন্য বিশেষ অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়তা করে। এই কন্ট্রোলটি সেশন বা কুকি ব্যবহার করে বাস্তবায়ন করা যায়।
উদাহরণ: অ্যাক্সেস কন্ট্রোল টুল তৈরি
import cherrypy
class AccessControl:
def check_access(self, required_role):
user_role = cherrypy.session.get('role', None)
if user_role is None or user_role != required_role:
raise cherrypy.HTTPError(403, "Access Denied: Unauthorized access")
class MyApp:
def __init__(self):
self.ac = AccessControl()
@cherrypy.expose
def index(self):
return "এটি সবার জন্য অ্যাক্সেসযোগ্য।"
@cherrypy.expose
@cherrypy.tools.allow(body="POST")
def admin(self):
# অ্যাডমিন রোল চেক
self.ac.check_access('admin')
return "এটি অ্যাডমিন পৃষ্ঠা, শুধুমাত্র অ্যাডমিনের জন্য।"
@cherrypy.expose
def user(self):
# ইউজার রোল চেক
self.ac.check_access('user')
return "এটি ইউজার পৃষ্ঠা, শুধুমাত্র ইউজারদের জন্য।"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
কোড ব্যাখ্যা:
AccessControlক্লাস: এই ক্লাসেcheck_accessমেথডটি ব্যবহারকারীর রোল যাচাই করে এবং প্রয়োজনীয় রোল না থাকলে 403 (Forbidden) ত্রুটি প্রদর্শন করে।adminএবংuserপাথ: শুধু নির্দিষ্ট রোলের জন্য অ্যাক্সেস অনুমোদিত। অন্যথায়, 403 ত্রুটি ফিরিয়ে দেওয়া হবে।
CherryPy তে রোল-ভিত্তিক অনুমোদন এবং অ্যাক্সেস কন্ট্রোলের সুবিধা:
- রোল-ভিত্তিক অ্যাক্সেস: আপনি ব্যবহারকারীর রোলের ভিত্তিতে অ্যাক্সেস কন্ট্রোল করতে পারেন (যেমন: অ্যাডমিন, ইউজার, গেস্ট)।
- কাস্টম সেশন ম্যানেজমেন্ট: CherryPy তে আপনি সেশন ব্যবহার করে ব্যবহারকারীর তথ্য পরিচালনা করতে পারেন।
- অ্যাক্সেস কন্ট্রোল টুলস: আপনি CherryPy এর
toolsব্যবহার করে বিভিন্ন রুটের জন্য আলাদা অ্যাক্সেস কন্ট্রোল সেট করতে পারেন।
CherryPy তে Role-based Authorization এবং Access Control ব্যবস্থাপনা সহজেই বাস্তবায়ন করা যায়। সঠিক রোল-ভিত্তিক অনুমোদন দিয়ে আপনি ব্যবহারকারীদের বিভিন্ন স্তরের অ্যাক্সেস প্রদান করতে পারবেন এবং এক্সেস কন্ট্রোল টুলের মাধ্যমে নির্দিষ্ট রুটে কাস্টম নিরাপত্তা নীতি প্রয়োগ করতে পারবেন। CherryPy এর tools এবং session ব্যবহারের মাধ্যমে এই সমস্ত নিরাপত্তা ব্যবস্থা দক্ষভাবে পরিচালনা করা সম্ভব।
Read more