Flask অ্যাপ্লিকেশনে Authentication (অথেনটিকেশন) ব্যবস্থাপনা একটি গুরুত্বপূর্ণ বিষয়। এটি ব্যবহারকারীদের সাইন ইন, সাইন আউট এবং নিরাপত্তা নিশ্চিত করতে সহায়ক। Flask সাধারণত Flask-Login, Flask-Security বা Flask-JWT-Extended এর মতো এক্সটেনশন ব্যবহার করে অথেনটিকেশন ব্যবস্থা তৈরি করতে সাহায্য করে।
এখানে আমরা Flask-Login ব্যবহার করে একটি সহজ অথেনটিকেশন সিস্টেম তৈরি করার উদাহরণ দেখাবো।
১. Flask-Login ব্যবহার করে Authentication
Flask-Login একটি জনপ্রিয় Flask এক্সটেনশন যা সেশন ম্যানেজমেন্ট এবং ব্যবহারকারী অথেনটিকেশন পরিচালনা করতে সহায়ক। এটি আপনার অ্যাপ্লিকেশনে লগইন এবং লগআউট ব্যবস্থাপনা সহজ করে তোলে।
ধাপ ১: Flask-Login ইনস্টল করা
প্রথমে Flask-Login ইনস্টল করতে হবে:
pip install flask-login
ধাপ ২: Flask অ্যাপে Flask-Login সেটআপ করা
এখন একটি সিম্পল Flask-Login সিস্টেম তৈরি করা যাক, যেখানে একটি ব্যবহারকারী লগইন করতে পারবেন।
- প্রথমে Flask অ্যাপ তৈরি করুন:
from flask import Flask, render_template, redirect, url_for, request
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.secret_key = 'সিক্রেট-কী' # সিক্রেট কী সেট করা
# Flask-Login ইনস্ট্যান্স তৈরি
login_manager = LoginManager()
login_manager.init_app(app)
# Dummy user store (এটি ডাটাবেসের পরিবর্তে একটি সিম্পল dictionary)
users = {'admin': {'password': 'adminpass'}}
# User class তৈরি (UserMixin ক্লাস থেকে ইনহেরিট করা)
class User(UserMixin):
def __init__(self, id):
self.id = id
# ব্যবহারকারীকে লগইন করা
@login_manager.user_loader
def load_user(user_id):
return User(user_id)
# হোমপেজ রাউট
@app.route('/')
def home():
return render_template('home.html')
# লগইন রাউট
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# Dummy authentication
if username in users and users[username]['password'] == password:
user = User(username)
login_user(user) # লগইন করা
return redirect(url_for('dashboard'))
else:
return 'Invalid credentials'
return render_template('login.html')
# Dashboard রাউট (লগইন চেক)
@app.route('/dashboard')
@login_required # এই রাউটটি শুধুমাত্র লগইন করা ব্যবহারকারীদের জন্য
def dashboard():
return f'Welcome to the dashboard, {current_user.id}!'
# লগআউট রাউট
@app.route('/logout')
@login_required
def logout():
logout_user() # লগআউট করা
return redirect(url_for('home'))
if __name__ == "__main__":
app.run(debug=True)
এখানে:
Userক্লাস: এটিUserMixinথেকে ইনহেরিট করা হয়েছে যা Flask-Login-এ লগইন করার জন্য মৌলিক ফাংশন সরবরাহ করে।user_loader: এটি একটি ফাংশন যা Flask-Login কে ব্যবহারকারী লোড করতে সাহায্য করে, এখানে আমরা সিম্পলভাবেusersdictionary থেকে ডাটা নিয়ে আসছি।login_user(): এটি ব্যবহারকারীকে লগইন করে এবং সেশন শুরু করে।@login_required: এটি একটি ডেকোরেটর যা নিশ্চিত করে যে ব্যবহারকারীকে লগইন করতে হবে যদি তারা এই রাউট এক্সেস করতে চায়।
২. HTML ফাইল তৈরি করা
templates/login.html (লগইন পেজ)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>লগইন</title>
</head>
<body>
<h2>লগইন করুন</h2>
<form method="POST">
<label for="username">ব্যবহারকারীর নাম:</label>
<input type="text" id="username" name="username" required><br><br>
<label for="password">পাসওয়ার্ড:</label>
<input type="password" id="password" name="password" required><br><br>
<input type="submit" value="লগইন">
</form>
</body>
</html>
templates/home.html (হোম পেজ)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>হোম পেজ</title>
</head>
<body>
<h2>স্বাগতম</h2>
<p><a href="{{ url_for('login') }}">লগইন করুন</a></p>
</body>
</html>
templates/dashboard.html (ড্যাশবোর্ড পেজ)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ড্যাশবোর্ড</title>
</head>
<body>
<h2>স্বাগতম {{ current_user.id }}!</h2>
<p><a href="{{ url_for('logout') }}">লগআউট করুন</a></p>
</body>
</html>
৩. অথেনটিকেশন স্ট্রাটেজি
এখানে Flask-Login ব্যবহৃত হয়েছে সিম্পল অথেনটিকেশন স্ট্রাটেজি হিসেবে, যেখানে ব্যবহারকারীর তথ্য users ডিকশনারিতে সেভ করা হয়েছে। আপনি চাইলে এই তথ্য ডাটাবেস থেকে নিয়েও ব্যবহার করতে পারেন।
Flask-Login এর অন্যান্য ফিচার:
login_user(user): ব্যবহারকারীকে লগইন করা।logout_user(): ব্যবহারকারীকে লগআউট করা।current_user: বর্তমানে লগইন করা ব্যবহারকারীকে নির্দেশ করে।@login_required: ব্যবহারকারী লগইন না থাকলে এক্সেস ব্লক করে।
৪. Flask-Login এর সুবিধা
- কাস্টম সেশন ম্যানেজমেন্ট: Flask-Login ব্যবহারকারীদের সেশন ম্যানেজমেন্টের জন্য সহায়ক।
- ডাইনামিক ব্যবহারকারী অথেনটিকেশন: Flask-Login বিভিন্ন ওয়েব ফিচারে ব্যবহারকারী অথেনটিকেশন সহজ করে তোলে।
- ইন্টিগ্রেশন: আপনি অন্যান্য ফিচার যেমন ফর্ম ভ্যালিডেশন বা ফ্লাস্ক সিকিউরিটি ইত্যাদি সংযুক্ত করতে পারেন।
Flask-এ Authentication ব্যবস্থাপনা প্রতিষ্ঠা করার জন্য Flask-Login এক্সটেনশন অত্যন্ত কার্যকর। এটি লগইন, লগআউট, সেশন ম্যানেজমেন্ট এবং নিরাপত্তা সংক্রান্ত সমস্ত কাজ সহজ করে তোলে। আপনি Flask-Login এর সাহায্যে আপনার অ্যাপ্লিকেশনকে নিরাপদ এবং স্কেলেবল করতে পারেন।
Flask একটি মাইক্রোফ্রেমওয়ার্ক, যার মাধ্যমে আপনি সহজেই ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারেন। ইউজার অথেনটিকেশন সিস্টেম তৈরি করার জন্য Flask-Login একটি জনপ্রিয় এক্সটেনশন। এটি ইউজারের লগইন, লগআউট, সেশন ম্যানেজমেন্টসহ অন্যান্য গুরুত্বপূর্ণ ফিচার সরবরাহ করে।
Flask-Login কী?
Flask-Login Flask অ্যাপ্লিকেশনগুলিতে ইউজার অথেনটিকেশন এবং সেশন ব্যবস্থাপনা সহজ করে তোলে। এটি লগইন, লগআউট, সেশন ইত্যাদির জন্য উপকারী ফাংশনালিটি প্রদান করে।
Flask-Login দিয়ে User Authentication সিস্টেম তৈরি করার ধাপ:
ধাপ ১: Flask এবং Flask-Login ইনস্টল করা
প্রথমে, আপনাকে Flask এবং Flask-Login এক্সটেনশন ইনস্টল করতে হবে। এটি ইনস্টল করতে নিচের কমান্ডটি চালান:
pip install flask flask-login
ধাপ ২: Flask অ্যাপ্লিকেশন তৈরি করা
এখন একটি Flask অ্যাপ্লিকেশন তৈরি করুন এবং Flask-Login এক্সটেনশনটি ইমপোর্ট করুন।
from flask import Flask, render_template, redirect, url_for, request
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
app = Flask(__name__)
app.secret_key = 'your_secret_key' # সিকিউরিটি জন্য সিক্রেট কী
# Flask-Login কনফিগারেশন
login_manager = LoginManager()
login_manager.init_app(app)
# Dummy user database (এই অংশটিকে ডাটাবেসের সাথে পরিবর্তন করা যেতে পারে)
users = {'admin': {'password': 'admin'}}
# User class
class User(UserMixin):
def __init__(self, id):
self.id = id
# User loader function
@login_manager.user_loader
def load_user(user_id):
return User(user_id) if user_id in users else None
@app.route('/')
def home():
return render_template('home.html')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
# ইউজার যাচাই
if username in users and users[username]['password'] == password:
user = User(username)
login_user(user)
return redirect(url_for('dashboard'))
else:
return 'Invalid credentials'
return render_template('login.html')
@app.route('/dashboard')
@login_required
def dashboard():
return f'Hello, {current_user.id}! Welcome to the dashboard.'
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('home'))
if __name__ == "__main__":
app.run(debug=True)
এখানে:
- UserMixin: Flask-Login এর একটি ক্লাস, যা User ক্লাসে অন্তর্ভুক্ত করা হয়। এটি ইউজারের কিছু ডিফল্ট ফাংশনালিটি প্রদান করে যেমন
is_authenticated,is_active, এবংis_anonymous। - User class: এটি একটি কাস্টম ইউজার ক্লাস। এখানে
idরয়েছে, যা ইউজারের ইউনিক আইডেন্টিফাইয়ার। - login_manager.user_loader: এই ফাংশনটি ইউজারের আইডি দিয়ে ইউজার লোড করে। যখনই Flask-Login ইউজারটিকে সেশন থেকে রিকোভার করতে চায়, তখন এটি কাজ করে।
- @login_required: এই ডেকোরেটরটি ব্যবহার করা হয় যেখানে লগইন করা ইউজার ছাড়া অন্য কেউ অ্যাক্সেস করতে পারবে না।
- login_user(): এটি ইউজারের লগইন প্রক্রিয়া সম্পন্ন করে এবং ইউজারকে সেশন শুরু করতে সাহায্য করে।
- logout_user(): এটি ইউজারকে লগআউট করে এবং সেশন বন্ধ করে দেয়।
ধাপ ৩: HTML টেমপ্লেট তৈরি করা
home.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Flask Login</title>
</head>
<body>
<h1>Welcome to Flask Authentication System</h1>
{% if current_user.is_authenticated %}
<p>Hello, {{ current_user.id }}! <a href="{{ url_for('logout') }}">Logout</a></p>
{% else %}
<p><a href="{{ url_for('login') }}">Login</a></p>
{% endif %}
</body>
</html>
login.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="POST">
<label for="username">Username:</label>
<input type="text" name="username" id="username" required><br>
<label for="password">Password:</label>
<input type="password" name="password" id="password" required><br>
<button type="submit">Login</button>
</form>
</body>
</html>
ধাপ ৪: অ্যাপ চালানো
- Home Page: হোম পেজে, যদি ইউজার লগইন থাকে, তবে তাকে হ্যালো বার্তা এবং লগআউট লিঙ্ক দেখানো হবে। অন্যথায়, লগইন লিঙ্ক দেখানো হবে।
- Login Page: এখানে ইউজার তার ইউজারনেম এবং পাসওয়ার্ড ইনপুট করে লগইন করতে পারবে।
- Dashboard Page: লগইন করা ইউজারকে ড্যাশবোর্ড পেজে নেওয়া হবে।
@login_requiredডেকোরেটর ইউজারের অথেনটিকেশন নিশ্চিত করে। - Logout: লগআউট হলে, সেশন ক্লিয়ার হয়ে যায় এবং ইউজার হোম পেজে ফিরে যায়।
এভাবে আপনি Flask এবং Flask-Login এর মাধ্যমে একটি বেসিক ইউজার অথেনটিকেশন সিস্টেম তৈরি করতে পারেন। Flask-Login একটি সহজ ও শক্তিশালী পদ্ধতি, যা ইউজারের লগইন, লগআউট, সেশন ম্যানেজমেন্ট এবং অথেনটিকেশন সহজ করে তোলে।
Flask-এ Password Hashing নিরাপত্তার একটি গুরুত্বপূর্ণ অংশ, কারণ সোজা পাসওয়ার্ড স্টোর করার মাধ্যমে অ্যাপ্লিকেশন নিরাপত্তাহীন হয়ে পড়তে পারে। পাসওয়ার্ড হ্যাশিংয়ের মাধ্যমে আপনি পাসওয়ার্ড নিরাপদে স্টোর করতে পারেন, যাতে কোনোভাবেই সরাসরি পাসওয়ার্ড অ্যাক্সেস করা না যায়। Flask-Bcrypt একটি জনপ্রিয় এক্সটেনশন যা Flask অ্যাপ্লিকেশনে পাসওয়ার্ড হ্যাশিং এবং সল্টিং সহজভাবে ইমপ্লিমেন্ট করার জন্য ব্যবহৃত হয়।
Flask-Bcrypt কি?
Flask-Bcrypt হল একটি এক্সটেনশন যা bcrypt প্যাকেজের মাধ্যমে পাসওয়ার্ড হ্যাশিং এবং সল্টিং সরবরাহ করে। এটি নিরাপদ পাসওয়ার্ড স্টোরেজের জন্য একটি শক্তিশালী এবং জনপ্রিয় উপায়।
১. Flask-Bcrypt ইনস্টলেশন
প্রথমে, আপনাকে Flask-Bcrypt ইনস্টল করতে হবে:
pip install flask-bcrypt
২. Flask-Bcrypt সেটআপ এবং কনফিগারেশন
Flask অ্যাপ্লিকেশনে Flask-Bcrypt সেটআপ করতে, প্রথমে Bcrypt ক্লাসটি ইনিশিয়ালাইজ করতে হবে এবং তারপর এটি অ্যাপ্লিকেশনে যোগ করতে হবে।
উদাহরণ:
from flask import Flask, request, jsonify
from flask_bcrypt import Bcrypt
app = Flask(__name__)
bcrypt = Bcrypt(app) # Bcrypt সেটআপ করা
# Dummy user data (In-memory database)
users = {}
@app.route("/register", methods=["POST"])
def register():
data = request.get_json()
username = data['username']
password = data['password']
# পাসওয়ার্ড হ্যাশিং
hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
# ডাটাবেসে (এখানে ইন-মেমরি ডাটাবেস ব্যবহার করা হয়েছে)
users[username] = hashed_password
return jsonify({"message": "User registered successfully!"}), 201
@app.route("/login", methods=["POST"])
def login():
data = request.get_json()
username = data['username']
password = data['password']
if username not in users:
return jsonify({"message": "User not found!"}), 404
# পাসওয়ার্ড চেক করা
hashed_password = users[username]
if bcrypt.check_password_hash(hashed_password, password):
return jsonify({"message": "Login successful!"}), 200
else:
return jsonify({"message": "Invalid password!"}), 400
if __name__ == "__main__":
app.run(debug=True)
এখানে:
bcrypt.generate_password_hash(password): এটি পাসওয়ার্ড হ্যাশ করে এবং একটি সল্টও যুক্ত করে।bcrypt.check_password_hash(hashed_password, password): এটি হ্যাশ করা পাসওয়ার্ডের সাথে ইনপুট পাসওয়ার্ড মেলানোর জন্য ব্যবহৃত হয়।
রেজিস্ট্রেশন পদ্ধতি:
- ব্যবহারকারী
POST /registerরিকোয়েস্ট পাঠালে তার পাসওয়ার্ড হ্যাশ করেusersডাটাবেসে (এখানে ইন-মেমরি ডাটাবেস) স্টোর করা হবে।
লগইন পদ্ধতি:
- লগইন করার সময়, ব্যবহারকারী
POST /loginরিকোয়েস্ট পাঠালে ইনপুট পাসওয়ার্ডটির সাথে হ্যাশ করা পাসওয়ার্ড মিলিয়ে চেক করা হবে। যদি পাসওয়ার্ড মিল থাকে, তাহলে ব্যবহারকারী লগইন সফল হবে।
৩. Password Hashing এবং Checking Example
Password Hashing:
পাসওয়ার্ড হ্যাশ করার জন্য Flask-Bcrypt-এর generate_password_hash() ফাংশন ব্যবহৃত হয়।
hashed_pw = bcrypt.generate_password_hash('mysecretpassword').decode('utf-8')
print(hashed_pw)
এটি পাসওয়ার্ডটির একটি সল্টযুক্ত হ্যাশ তৈরি করবে, যা সহজেই ডিকোড করা যাবে না।
Password Checking:
যখন ব্যবহারকারী পাসওয়ার্ড ইনপুট করে, আপনি check_password_hash() ফাংশন ব্যবহার করে পাসওয়ার্ডটি সঠিক কিনা যাচাই করতে পারেন:
is_correct = bcrypt.check_password_hash(hashed_pw, 'mysecretpassword')
if is_correct:
print("Password matched!")
else:
print("Password doesn't match!")
৪. Flask-Bcrypt এবং নিরাপত্তা
Flask-Bcrypt পাসওয়ার্ড হ্যাশিংয়ের জন্য bcrypt অ্যালগোরিদম ব্যবহার করে, যা অত্যন্ত শক্তিশালী এবং সময়সাপেক্ষ প্রক্রিয়া। এটি পাসওয়ার্ডের সল্ট (salt) যোগ করে, যাতে একই পাসওয়ার্ডের জন্য ভিন্ন ভিন্ন হ্যাশ তৈরি হয়, এবং এটি স্নোপিং বা রিভার্স ইঞ্জিনিয়ারিং প্রতিরোধ করে।
পাসওয়ার্ড হ্যাশিংয়ের সুবিধা:
- নিরাপত্তা: পাসওয়ার্ড কখনোই সরাসরি ডাটাবেসে সঞ্চিত হয় না।
- সল্টিং (Salting): পাসওয়ার্ড হ্যাশ করার সময় স্বয়ংক্রিয়ভাবে সল্ট যোগ করা হয়, যা হ্যাশটিকে আরও নিরাপদ করে তোলে।
- নির্দিষ্ট হ্যাশিং অ্যালগোরিদম: bcrypt অ্যালগোরিদম শক্তিশালী এবং ধীরগতিতে কাজ করে, যা আক্রমণকারীদের জন্য শক্ত বাধা তৈরি করে।
৫. Flask-Bcrypt এর ব্যবহারিক সুবিধা
- Security Best Practices: সঠিক পাসওয়ার্ড স্টোরেজ ব্যবস্থাপনার জন্য এটি সর্বোত্তম পদ্ধতি।
- Salted Hashing: bcrypt সল্টিং এবং হ্যাশিং ব্যবহারের মাধ্যমে পাসওয়ার্ডটি সুরক্ষিত রাখে।
- Easy Integration: Flask-Bcrypt সহজেই Flask অ্যাপ্লিকেশনে ইন্টিগ্রেট করা যায় এবং নিরাপত্তা ব্যবস্থাপনা সহজ হয়।
Flask-Bcrypt একটি শক্তিশালী এবং সহজ পদ্ধতি যা Flask অ্যাপ্লিকেশনে পাসওয়ার্ড হ্যাশিং এবং সল্টিং সম্পাদন করতে ব্যবহৃত হয়। এটি ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশনকে শক্তিশালী নিরাপত্তা প্রদান করতে পারেন এবং ব্যবহারকারীদের পাসওয়ার্ডকে সুরক্ষিত রাখতে পারবেন। Flask-Bcrypt পাসওয়ার্ডের জন্য নিরাপদ হ্যাশিং পদ্ধতি সরবরাহ করে, যা বর্তমানে সবচেয়ে কার্যকরী নিরাপত্তা ব্যবস্থা হিসেবে গণ্য করা হয়।
Flask-এ User Registration এবং Login System তৈরি করা খুবই সহজ। এটি সাধারণত Flask-WTF (Web Forms) এবং Flask-Login ব্যবহার করে করা হয়। Flask-WTF ফর্ম হ্যান্ডলিং এবং ভ্যালিডেশন করতে সাহায্য করে, এবং Flask-Login ব্যবহারকারীর সেশন পরিচালনা করার জন্য ব্যবহৃত হয়।
এখানে আমরা Flask-এ একটি সিম্পল User Registration এবং Login System তৈরি করার পদ্ধতি ব্যাখ্যা করব।
প্রয়োজনীয় প্যাকেজ ইনস্টলেশন
প্রথমে আপনাকে কয়েকটি প্যাকেজ ইনস্টল করতে হবে:
pip install flask flask-sqlalchemy flask-wtf flask-login werkzeug
- Flask-SQLAlchemy: ডাটাবেস ইন্টিগ্রেশন।
- Flask-WTF: ফর্ম হ্যান্ডলিং এবং ভ্যালিডেশন।
- Flask-Login: ইউজার সেশন ম্যানেজমেন্ট।
- Werkzeug: সিকিউর পাসওয়ার্ড হ্যাশিং।
১. প্রজেক্ট সেটআপ
প্রথমে, Flask অ্যাপ্লিকেশন তৈরি করুন এবং Flask-SQLAlchemy, Flask-WTF, এবং Flask-Login কনফিগার করুন।
app.py ফাইল তৈরি করা:
from flask import Flask, render_template, redirect, url_for, request, flash
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from flask_login import UserMixin, login_user, login_required, logout_user, LoginManager, current_user
from werkzeug.security import generate_password_hash, check_password_hash
from wtforms import StringField, PasswordField
from wtforms.validators import DataRequired, Email
app = Flask(__name__)
# Flask কনফিগারেশন সেটিংস
app.config['SECRET_KEY'] = 'আপনার-গোপন-কী'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# ডাটাবেস ইনিশিয়ালাইজ
db = SQLAlchemy(app)
# Flask-Login ইনিশিয়ালাইজ
login_manager = LoginManager(app)
login_manager.login_view = 'login'
# ইউজার মডেল
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(100), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(200), nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
# ফর্ম ডেফিনিশন
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
confirm_password = PasswordField('Confirm Password', validators=[DataRequired()])
class LoginForm(FlaskForm):
email = StringField('Email', validators=[DataRequired(), Email()])
password = PasswordField('Password', validators=[DataRequired()])
# Home Route
@app.route('/')
def home():
return render_template('index.html')
# User Registration Route
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = generate_password_hash(form.password.data, method='sha256')
user = User(username=form.username.data, email=form.email.data, password=hashed_password)
db.session.add(user)
db.session.commit()
flash('Your account has been created!', 'success')
return redirect(url_for('login'))
return render_template('register.html', form=form)
# User Login Route
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
user = User.query.filter_by(email=form.email.data).first()
if user and check_password_hash(user.password, form.password.data):
login_user(user)
flash('You have been logged in!', 'success')
return redirect(url_for('dashboard'))
else:
flash('Login Unsuccessful. Please check email and password', 'danger')
return render_template('login.html', form=form)
# Dashboard Route (Protected)
@app.route('/dashboard')
@login_required
def dashboard():
return f'Hello, {current_user.username}! Welcome to your dashboard.'
# Logout Route
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('home'))
# User Loader for Flask-Login
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
if __name__ == "__main__":
app.run(debug=True)
২. HTML টেমপ্লেট তৈরি করা
register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Registration</title>
</head>
<body>
<h2>Register</h2>
<form method="POST">
{{ form.hidden_tag() }}
<div>{{ form.username.label }} {{ form.username() }}</div>
<div>{{ form.email.label }} {{ form.email() }}</div>
<div>{{ form.password.label }} {{ form.password() }}</div>
<div>{{ form.confirm_password.label }} {{ form.confirm_password() }}</div>
<button type="submit">Register</button>
</form>
<p>Already have an account? <a href="{{ url_for('login') }}">Login</a></p>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form method="POST">
{{ form.hidden_tag() }}
<div>{{ form.email.label }} {{ form.email() }}</div>
<div>{{ form.password.label }} {{ form.password() }}</div>
<button type="submit">Login</button>
</form>
<p>Don't have an account? <a href="{{ url_for('register') }}">Register</a></p>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome</title>
</head>
<body>
<h1>Welcome to the Flask App!</h1>
<a href="{{ url_for('register') }}">Register</a> | <a href="{{ url_for('login') }}">Login</a>
</body>
</html>
৩. ডাটাবেস তৈরি এবং Flask চালানো
এখন Flask অ্যাপ্লিকেশন চালানোর আগে ডাটাবেস তৈরি করতে হবে:
python
>>> from app import db
>>> db.create_all()
এটি site.db নামের একটি SQLite ডাটাবেস তৈরি করবে এবং আপনার মডেল অনুযায়ী টেবিল তৈরি করবে।
৪. অ্যাপ্লিকেশন চালানো
এখন Flask অ্যাপ্লিকেশন চালাতে পারেন:
python app.py
এটি আপনার অ্যাপ্লিকেশন চালু করবে এবং আপনার ব্রাউজারে http://127.0.0.1:5000/ URL ওপেন করলে আপনি হোম পেজ দেখতে পাবেন।
৫. ব্যবহারকারীদের লগইন এবং রেজিস্ট্রেশন ফিচার
- Registration Page: নতুন ব্যবহারকারীদের রেজিস্ট্রেশন করতে সহায়তা করবে এবং তাদের তথ্য ডাটাবেসে সংরক্ষণ করবে।
- Login Page: ব্যবহারকারীদের লগইন করার সুযোগ দিবে, এবং সঠিক তথ্য দেওয়ার পর তাদের সেশন চালু করবে।
- Dashboard: লগইন করার পর ব্যবহারকারীকে তাদের ড্যাশবোর্ডে পাঠানো হবে।
Flask-এ User Registration এবং Login System তৈরি করা খুবই সহজ এবং সুরক্ষিত। আমরা Flask-SQLAlchemy ব্যবহার করে ডাটাবেস পরিচালনা করেছি, Flask-WTF ব্যবহার করেছি ফর্ম হ্যান্ডলিং এবং ভ্যালিডেশনের জন্য, এবং Flask-Login ব্যবহার করে সেশন ম্যানেজমেন্ট করেছি। এই সিস্টেমটি আরো উন্নত এবং সুরক্ষিত করতে আপনি ফর্ম ভ্যালিডেশন, পাসওয়ার্ড হ্যাশিং, এবং ফ্ল্যাশ মেসেজ ব্যবহার করতে পারেন।
Flask অ্যাপ্লিকেশনগুলিতে Session Management এবং Security দুটি গুরুত্বপূর্ণ বিষয়। Flask অ্যাপ্লিকেশন তৈরি করার সময় সেশন পরিচালনা এবং নিরাপত্তা নিশ্চিত করা গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশন এবং ব্যবহারকারীদের ডেটা সুরক্ষিত রাখে। Flask সেশন এবং নিরাপত্তা ব্যবস্থাপনা সহজ করে দিয়েছে তবে কিছু বেস্ট প্র্যাকটিস অনুসরণ করা জরুরি।
১. Session Management in Flask
Flask সেশন ব্যবহারকারীকে অ্যাপ্লিকেশনে ডেটা স্টোর করার জন্য ব্যবহৃত হয়, যেমন লগইন তথ্য বা ইউজারের বিভিন্ন পছন্দ। Flask-এ সেশন পরিচালনার জন্য session অবজেক্ট ব্যবহৃত হয়, যা একটি পির্শানালাইজড ডাটাবেস হিসেবে কাজ করে। সেশন ডেটা কুকি-এর মাধ্যমে ব্রাউজারে সংরক্ষিত থাকে, কিন্তু এটি এনক্রিপ্ট করা হয় এবং Flask-এ সিকিউরিটি নিশ্চিত করা হয়।
১.১. Flask সেশন ব্যবহার করা
from flask import Flask, session, redirect, url_for, request
app = Flask(__name__)
# Secret key সেট করা যাতে সেশন এনক্রিপ্ট করা যায়
app.config['SECRET_KEY'] = 'আপনার-গোপন-কী'
@app.route('/')
def home():
return 'স্বাগতম Flask অ্যাপে!'
@app.route('/set_session', methods=['GET', 'POST'])
def set_session():
if request.method == 'POST':
session['username'] = request.form['username'] # সেশন সেট করা
return redirect(url_for('get_session'))
return '''
<form method="post">
Username: <input type="text" name="username">
<input type="submit" value="Submit">
</form>
'''
@app.route('/get_session')
def get_session():
username = session.get('username', 'Guest') # সেশন থেকে ডেটা পাওয়া
return f"Hello, {username}!"
@app.route('/logout')
def logout():
session.pop('username', None) # সেশন থেকে ডেটা মুছে ফেলা
return redirect(url_for('home'))
if __name__ == "__main__":
app.run(debug=True)
এখানে:
session['username']: সেশনে ব্যবহারকারীর নাম সংরক্ষণ করা হয়েছে।session.get('username', 'Guest'): সেশনে নাম পাওয়া না গেলে ডিফল্ট মানGuestব্যবহার করা হয়েছে।session.pop('username'): সেশন থেকে ডেটা মুছে ফেলা।
১.২. Session Security
- Secret Key: Flask সেশনে
SECRET_KEYব্যবহার করে এনক্রিপ্টেড কুকি তৈরি করা হয়। এটি সুরক্ষিত রাখতে গুরুত্বপূর্ণ। Session Timeout: সেশনটির একটি টাইমআউট নির্ধারণ করতে Flask-এ
PERMANENT_SESSION_LIFETIMEকনফিগারেশন ব্যবহার করা যেতে পারে।from datetime import timedelta app.permanent_session_lifetime = timedelta(minutes=5)- Session Storage: Flask ডিফল্টভাবে সেশন তথ্য ব্রাউজারের কুকিতে সংরক্ষণ করে। আপনি চাইলে এটি ডাটাবেসে বা অন্য কোথাও সংরক্ষণ করতে পারেন।
২. Flask Security Best Practices
Flask অ্যাপ্লিকেশন তৈরি করার সময় নিরাপত্তা নিশ্চিত করা খুবই গুরুত্বপূর্ণ। নিচে কিছু বেস্ট প্র্যাকটিস দেওয়া হলো যা আপনাকে Flask অ্যাপ্লিকেশন নিরাপদ রাখতে সহায়তা করবে।
২.১. Secret Key এবং Session Encryption
Flask সেশন এবং অন্যান্য নিরাপত্তা ফিচারগুলির জন্য SECRET_KEY অত্যন্ত গুরুত্বপূর্ণ। এটি সেশন, ফর্ম এবং অন্যান্য নিরাপত্তা সুবিধাগুলির জন্য এনক্রিপশন প্রদান করে।
কনফিগারেশন:
app.config['SECRET_KEY'] = 'আপনার-গোপন-কী'
এটি একটি শক্তিশালী, এলোমেলো (random) গোপন কী ব্যবহার করা উচিত। আপনি এটি পরিবেশ ভেরিয়েবল হিসেবে সেট করতে পারেন।
২.২. Cross-Site Request Forgery (CSRF) Protection
CSRF (Cross-Site Request Forgery) হল একটি সিকিউরিটি দুর্বলতা যেখানে একটি অ্যাটাকার ব্যবহারকারীকে একটি অননুমোদিত রিকোয়েস্ট পাঠানোর জন্য প্ররোচিত করে। Flask-এ Flask-WTF এক্সটেনশন ব্যবহার করে CSRF সুরক্ষা চালু করা যায়।
Flask-WTF ইনস্টল করা:
pip install flask-wtfCSRF Protection ব্যবহার করা:
from flask_wtf import FlaskForm from wtforms import StringField from wtforms.validators import DataRequired class MyForm(FlaskForm): username = StringField('Username', validators=[DataRequired()]) @app.route('/form', methods=['GET', 'POST']) def form(): form = MyForm() if form.validate_on_submit(): return f"Hello, {form.username.data}!" return render_template('form.html', form=form)
এখানে:
FlaskFormএবংFlask-WTFCSRF সুরক্ষা নিশ্চিত করে।
২.৩. Password Hashing
ব্যবহারকারীর পাসওয়ার্ড কখনোই সরাসরি সংরক্ষণ করবেন না। বরং password hashing ব্যবহার করুন, যাতে পাসওয়ার্ডটি এনক্রিপ্ট করা থাকে।
Flask-এ পাসওয়ার্ড হ্যাশিংয়ের জন্য werkzeug.security ব্যবহার করা যেতে পারে।
Flask-এ পাসওয়ার্ড হ্যাশিং:
from werkzeug.security import generate_password_hash, check_password_hash hashed_password = generate_password_hash('user_password') # পাসওয়ার্ড চেক করা check_password_hash(hashed_password, 'user_password') # Returns True or False
এখানে:
generate_password_hash(): এটি পাসওয়ার্ড হ্যাশ করে।check_password_hash(): এটি হ্যাশ করা পাসওয়ার্ডের সাথে ব্যবহারকারীর ইনপুট মিলিয়ে চেক করে।
২.৪. SQL Injection Protection
Flask-SQLAlchemy-এর সাথে ORM ব্যবহারের মাধ্যমে আপনি SQL Injection থেকে সুরক্ষা পেতে পারেন। সরাসরি SQL কোড লেখার থেকে ORM পদ্ধতি ব্যবহার করা নিরাপদ।
SQLAlchemy ব্যবহার করা:
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) # সঠিকভাবে প্যারামিটারাইজড কোয়েরি user = User.query.filter_by(username='john').first()
এখানে:
- SQLAlchemy ব্যবহার করলে SQL Injection ঝুঁকি কমে যায়, কারণ এটি প্যারামিটারাইজড কোয়েরি তৈরি করে।
২.৫. HTTPS ব্যবহার করা
HTTPS ব্যবহার করা নিরাপত্তার জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি ডেটা এনক্রিপ্ট করে। Flask অ্যাপ্লিকেশন চালানোর সময় আপনাকে SSL সার্টিফিকেট ব্যবহার করতে হবে।
- HTTPS চালু করার জন্য:
- Flask সাধারণত ডিফল্টভাবে HTTP ব্যবহার করে। আপনি HTTPS চালু করার জন্য একটি SSL সার্টিফিকেটের মাধ্যমে Flask অ্যাপটি চালাতে পারেন।
৩. Flask অ্যাপ্লিকেশন সুরক্ষার অন্যান্য গুরুত্বপূর্ণ দিক
Error Handling: Flask অ্যাপ্লিকেশনে কাস্টম ত্রুটি হ্যান্ডলার ব্যবহার করা উচিত, যা নিরাপত্তা নিশ্চিত করতে সাহায্য করবে।
@app.errorhandler(404) def page_not_found(error): return "Page not found", 404- Logging: নিরাপত্তার জন্য Flask অ্যাপ্লিকেশনে লোগিং সিস্টেম ব্যবহার করা উচিত, যা অ্যাপ্লিকেশনের সব অনৈতিক প্রবণতা রেকর্ড করবে।
- Environment-Specific Configurations: Flask অ্যাপ্লিকেশনের জন্য ডেভেলপমেন্ট এবং প্রোডাকশন পরিবেশে আলাদা কনফিগারেশন ব্যবহার করা উচিত।
Flask অ্যাপ্লিকেশনের সুরক্ষা নিশ্চিত করতে সেশন ব্যবস্থাপনা এবং নিরাপত্তা ফিচারগুলো খুবই গুরুত্বপূর্ণ। SECRET_KEY ব্যবহার, password hashing, CSRF protection, এবং SQL injection সুরক্ষা Flask অ্যাপ্লিকেশনের সুরক্ষা নিশ্চিত করতে গুরুত্বপূর্ণ পদক্ষেপ। Flask-এর এই বেস্ট প্র্যাকটিসগুলো অনুসরণ করে আপনি আপনার অ্যাপ্লিকেশনকে নিরাপদ এবং কার্যকরী রাখতে পারবেন।
Read more