Middleware হলো একটি গুরুত্বপূর্ণ অংশ Rails অ্যাপ্লিকেশনের সিস্টেমে যা রিকোয়েস্ট এবং রেসপন্সের মধ্যে কাজ করে। এটি সাধারণত রিকোয়েস্ট হ্যান্ডলিংয়ের প্রক্রিয়ায় অগ্রগতি করতে সাহায্য করে, যেমন লগিং, সেশন ম্যানেজমেন্ট, অ্যাপ্লিকেশনের নিরাপত্তা বৃদ্ধি, ইত্যাদি। Rails এর মধ্যে বেশ কিছু built-in middleware রয়েছে, তবে কখনও কখনও আপনার অ্যাপ্লিকেশনের জন্য custom middleware তৈরি করা দরকার হতে পারে।
Rails-এ custom middleware তৈরি এবং কনফিগার করার প্রক্রিয়া বেশ সহজ। এখানে আমরা দেখব কীভাবে একটি কাস্টম মিডলওয়্যার তৈরি করতে হয় এবং কীভাবে এটি কনফিগার করা যায়।
Middleware কী?
Middleware হলো একটি সফটওয়্যার উপাদান যা রিকোয়েস্ট এবং রেসপন্সের মধ্যে কাজ করে। এটি সাধারণত রিকোয়েস্ট প্রসেসিং চেইনে থাকে এবং কাস্টম লজিক প্রয়োগ করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি রিকোয়েস্টের পূর্বে বা পরবর্তী অংশে কিছু নির্দিষ্ট কাজ করতে পারেন, যেমন লগিং, সেশন ভ্যালিডেশন, অ্যাক্সেস কন্ট্রোল, এবং অন্যান্য কাস্টম অপারেশন।
Custom Middleware তৈরি করা
Rails-এ একটি custom middleware তৈরি করার জন্য আপনাকে একটি ক্লাস তৈরি করতে হবে যা call মেথড প্রণয়ন করবে। এই call মেথডটি রিকোয়েস্ট এবং রেসপন্স অবজেক্ট নিয়ে কাজ করবে এবং যেটি রিকোয়েস্ট প্রসেসিং চেইনে যোগ হবে।
১. Custom Middleware ক্লাস তৈরি করা
প্রথমে একটি কাস্টম মডেল তৈরি করুন, যেখানে আপনার মডিফাইড রিকোয়েস্ট লজিক থাকবে। এখানে আমরা একটি উদাহরণ হিসেবে একটি মিডলওয়্যার তৈরি করব যা ইউজার ইন্টারঅ্যাকশন লগ করবে।
# app/middleware/log_user_interaction.rb
class LogUserInteraction
def initialize(app)
@app = app
end
def call(env)
# রিকোয়েস্ট লজিক
request = Rack::Request.new(env)
# ইউজারের IP এবং টাইমস্ট্যাম্প লগ করা
Rails.logger.info "User IP: #{request.ip}, Request Time: #{Time.now}"
# পরবর্তী মিডলওয়্যারে রিকোয়েস্ট পাঠান
@app.call(env)
end
end
এখানে, LogUserInteraction ক্লাসটি initialize মেথডের মাধ্যমে অ্যাপ্লিকেশন ইনস্ট্যান্স নেয় এবং তারপরে call মেথডে env (যা রিকোয়েস্ট ডেটা ধারণ করে) গ্রহণ করে। এটি ইউজারের আইপি এবং রিকোয়েস্ট টাইম লগ করে এবং তারপর পরবর্তী মডিউলে রিকোয়েস্ট পাঠিয়ে দেয়।
Custom Middleware কনফিগার করা
আপনার তৈরি করা কাস্টম মডিউলটি ব্যবহার করতে, আপনাকে সেটি Rails অ্যাপ্লিকেশন কনফিগারেশনে যোগ করতে হবে। Rails অ্যাপ্লিকেশনটি এমনভাবে কনফিগার করা হয় যাতে মডিউলটি রিকোয়েস্ট প্রসেসিং চেইনে অন্তর্ভুক্ত হয়।
২. Middleware কনফিগার করা
Rails অ্যাপ্লিকেশনের কনফিগারেশন ফাইলে আপনার কাস্টম মিডলওয়্যার যোগ করতে হবে। এটি config/application.rb ফাইলে করা হয়:
# config/application.rb
module YourApp
class Application < Rails::Application
# অন্যান্য কনফিগারেশন
# Custom middleware যোগ করা
config.middleware.use "LogUserInteraction"
end
end
এখানে, config.middleware.use এর মাধ্যমে LogUserInteraction মডিউলটি অ্যাপ্লিকেশনের মিডলওয়্যার চেইনে যুক্ত করা হয়েছে।
Middleware অ্যাপ্লিকেশন চেইনে স্থান
মিডলওয়্যারটি যেখানে রাখা হবে তার উপর নির্ভর করে এর প্রভাব কিভাবে পড়বে:
- যদি এটি রিকোয়েস্ট হ্যান্ডলিংয়ের প্রাথমিক পর্যায়ে থাকে, তবে এটি প্রথমে চলবে এবং পরবর্তী মডিউল বা কন্ট্রোলারের আগে কাজ করবে।
- যদি এটি রেসপন্স হ্যান্ডলিংয়ের শেষে থাকে, তবে এটি রেসপন্সটি ফিরে আসার পর কাজ করবে।
আপনি চাইলে আপনার কাস্টম মডিউলটি বিশেষ পর্যায়ে নির্ধারণ করতে পারেন।
Custom Middleware এর ব্যবহার
একটি কাস্টম মিডলওয়্যার ব্যবহার করা যেতে পারে বিভিন্ন কারণে, যেমন:
- Authentication and Authorization: ইউজার লোগিন এবং পারমিশন যাচাই করা।
- Logging: ইউজারের রিকোয়েস্ট এবং অ্যাকশন লগ করা।
- Request Throttling: একাধিক রিকোয়েস্টের ক্ষেত্রে থ্রটলিং প্রয়োগ করা (rate limiting)।
- Custom Error Handling: বিশেষ ধরনের ত্রুটি পরিচালনা করা।
উদাহরণ - Rate Limiting Middleware
ধরা যাক, আপনি একটি Rate Limiting Middleware তৈরি করতে চান যা একই IP থেকে একাধিক রিকোয়েস্ট পাঠানো বন্ধ করবে।
# app/middleware/rate_limiter.rb
class RateLimiter
def initialize(app)
@app = app
end
def call(env)
request = Rack::Request.new(env)
# সিম্পল Rate Limiting: এক মিনিটে ১০০ রিকোয়েস্টের বেশি নয়
ip = request.ip
if too_many_requests?(ip)
[429, { "Content-Type" => "text/plain" }, ["Too many requests"]]
else
# রিকোয়েস্ট চালিয়ে যাওয়ার অনুমতি দিন
@app.call(env)
end
end
private
def too_many_requests?(ip)
# এখানে আপনি একটি রেট লিমিট চেক করতে পারেন
# যেমন, IP এ ১০০ রিকোয়েস্টের বেশি হলে false ফেরত দেওয়া হবে।
# (এটি একটি সিম্পল উদাহরণ, বাস্তবে ডেটাবেস বা রেডিস ব্যবহার করতে পারেন)
false
end
end
এটি config/application.rb ফাইলে যোগ করুন:
# config/application.rb
module YourApp
class Application < Rails::Application
# Middleware কনফিগারেশন
config.middleware.use "RateLimiter"
end
end
এটি নিশ্চিত করবে যে একই IP থেকে ১০০টির বেশি রিকোয়েস্ট হলে 429 Too Many Requests ত্রুটি ফেরত পাঠানো হবে।
সারমর্ম
Rails-এ Custom Middleware তৈরি এবং কনফিগার করা একটি শক্তিশালী টুল যা আপনাকে রিকোয়েস্ট এবং রেসপন্স প্রক্রিয়ায় কাস্টম লজিক প্রয়োগ করতে সাহায্য করে। আপনি বিভিন্ন কাজ যেমন Logging, Authentication, Rate Limiting, Error Handling ইত্যাদি করতে পারেন। একটি কাস্টম মডিউল তৈরি করতে, আপনাকে শুধু call মেথড প্রণয়ন করতে হবে এবং তারপর এটি middleware stack-এ যোগ করতে হবে। এর মাধ্যমে আপনার অ্যাপ্লিকেশন আরও দক্ষ এবং কাস্টমাইজযোগ্য হবে।
Read more