২০,০০০+ GitHub স্টার এবং অসংখ্য ইন্টিগ্রেশনসহ Devise gem রুবি ল্যান্ডস্কেপের সবচেয়ে জনপ্রিয় gem-এ একটি। তবুও আমরা এটাকে রুবির "hidden gem" বলি কেন? কারণ জনপ্রিয় থাকা সত্ত্বেও অধিকাংশ ডেভেলপার এই লাইব্রেরির ক্যাপাবিলিটির সারফেস মাত্র স্ক্র্যাচ করে।
এই টু-পার্ট সিরিজে আমরা Devise-এ গভীরে যাব।
প্রথম পার্টে কী কী থাকবে
- Devise কী এবং কেন ব্যবহার করা উচিত (এবং কখন ব্যবহার করা উচিত নয়)
- Devise ইনস্টল এবং প্রজেক্টে ব্যবহার
- প্রজেক্ট অনুযায়ী লাইব্রেরি কাস্টমাইজেশন
দ্বিতীয় পার্টে কী কী থাকবে
- OmniAuth এবং API-only অ্যাপ্লিকেশনে Devise ব্যবহার
- অথোরাইজেশন লাইব্রেরির সাথে Devise ইন্টিগ্রেশন
পূর্বশর্ত
এই টিউটোরিয়ালে একটি সিম্পল Ruby on Rails 7 অ্যাপ্লিকেশন ব্যবহার করব যাতে ইউজার এবং টাস্ক আছে। ইউজার রেজিস্টার, লগ ইন, লগ আউট করতে পারবে এবং তাদের অ্যসাইন করা রোল অনুযায়ী টাস্কের জন্য create, read, update, delete একশন করবে।
Devise পরিচিতি
Devise হল Warden এর ওপর নির্মিত একটি অথেনটিকেশন লাইব্রেরি। Warden হল একটি Rack-ভিত্তিক অথেনটিকেশন ফ্রেমওয়ার্ক।
Warden সিকিউর সেশন স্ট্রিং ব্যবহার করে লগড-ইন ইউজারদের আইডেন্টিটি ভেরিফাই করে। একই সাথে লগ ইন না করা ইউজারদের রিস্ট্রিক্টেড রিসোর্স অ্যাক্সেস ব্লক করে।
কিন্তু Warden শুধু Rack-ভিত্তিক হওয়ায় কন্ট্রোলার অ্যাকশন, ভিউ, হেল্পার বা অন্যান্য কনফিগারেশন অপশন যোগ করে না যা একটি প্রপার ইউজার অথেনটিকেশন সলিউশন बनाने লাগে। Devise এই সব কিছু যোগ করে।
Devise-এর অন্য একটি বড় ফিচার হলো এর modularity। লাইব্রেরিতে প্রায় ১০টি মডিউল থাকে যা আপনাকে স্পেসিফাই করতে দেয় আপনার অ্যাপ্লিকেশনে অথেনটিকেশন কীভাবে হ্যান্ডেল হবে। সব ১০টি মডিউল ব্যবহার করতে হয় না — শুধু প্রয়োজনীয়গুলো এক্টিভেট করুন। এই মডিউলগুলো شامل: Registerable, Omniauthable, Trackable, ইত্যাদি।
শুরু করা যাক: Devise ইনস্টলেশন
$ bundle exec rails new tasks_app
$ bundle add devise
$ bundle exec rails g devise:install
এই কমান্ড Devise ইনস্টল করে এবং এর ইলিশিয়ালাইজার ফাইল জেনারেট করে। জেনারেটর কিছু সেটআপ সাজেশন দেবে — সেগুলো ফলো করুন।
Devise User Model জেনারেট করুন
Devise-এর জন্য একটি ইউজার মডেল লাগে। নাম আপনার পছন্দ বা ইউজ কেস অনুযায়ী User বা Admin হতে পারে।
$ bundle exec rails g devise User
এটি app/models/user.rb, মাইগ্রেশন ফাইল, এবং ইউজার রিসোর্সের জন্য রুট জেনারেট করবে।
$ bundle exec rails db:migrate
Task Model জেনারেট করুন
আমাদের অ্যাপে:
- ইউজার রেজিস্টার করতে পারবে
- সাইন ইন/আউট করতে পারবে
- টাস্ক তৈরি করতে পারবে (যা তার নিজস্ব)
- রোল অনুযায়ী টাস্কের সাথে ইন্টারঅ্যাক্ট করতে পারবে/নहीं পারবে
$ bundle exec rails g scaffold Task title:string body:text status:integer user:references
$ bundle exec rails db:migrate
Task মডেলে belongs_to :user অটোমেটিক্যালি যোগ হয়ে যাবে। Task মডেলে status-এর জন্য enum ব্যবহার করুন।
Devise-এর মডিউলসমূহ
Devise-এর কী ফিচার হলো modularity। আপনি অথেনটিকেশন প্রসেসকে আলাদা আলাদা পার্টে ভাগ করে আলাদা আলাদা ম্যানেজ করতে পারেন।
Devise-এর লেটেস্ট ভার্সনে ১০টি মডিউল আছে:
- Database authenticatable — ইউজার-সাপ্লাইড পাসওয়ার্ডকে সিকিউর হ্যাশে কনভার্ট করে ডেটাবেসে স্টোর করে, সাইন-ইন টাইমে ভেরিফাই করে।
- Omniauthable — OmniAuth অথেনটিকেশন সক্ষম করে।
- Lockable — ফেইলড লগইন সংখ্যায় অ্যাকাউন্ট লক করে, নির্দিষ্ট সময় বা ইমেইল দিয়ে আনলক হয়।
- Trackable — লগইন সংখ্যা, IP অ্যাড্রেস, লগইন টাইমস্ট্যাম্প ট্র্যাক করে।
- Confirmable — রেজিস্ট্রেশনে কনফার্মেশন ইমেইল পাঠায়, লগইন টাইমে কনফার্মড কিনা চেক করে।
- Registerable — ইউজার অ্যাকাউন্ট রেজিস্টার, এডিট, ডিলিট হ্যান্ডেল করে।
- Recoverable — পাসওয়ার্ড রিসেট এবং অ্যাকাউন্ট রিকভারি হ্যান্ডেল করে।
- Timeoutable — নির্দিষ্ট সময় পর ইউজার সেশন এক্সপায়ার করে।
- Validatable — ইমেইল এবং পাসওয়ার্ডের জন্য কাস্টম ভ্যালিডেশন রুল ডিফাইন করতে দেয়।
- Rememberable — কুকি ব্যবহার করে অথেনটিকেশনে ইউজারকে মনে রাখে।
Devise Helpers এবং Filters
Devise কন্ট্রোলার রিসোর্স এবং ভিউতে অ্যাক্সেস ম্যানেজ করার জন্য কনভেনিয়েন্ট হেল্পার দিয়ে থাকে:
user_signed_in?— বর্তমানে লগড-ইন ইউজার আছে কিনা চেক করেcurrent_user— বর্তমান লগড-ইন ইউজার রেফারেন্স (যেমনcurrent_user.email)user_session— বর্তমান ইউজারের সেশনdestroy_user_session_path— সেশন ডিস্ট্রয় করে রিডাইরেক্ট করেnew_user_session_path— লগইন ভিউ রেসপন্স করেedit_user_registration_path— রেজিস্ট্রেশন ডিটেইলস এডিট ভিউnew_user_registration_path— রেজিস্ট্রেশন ফর্ম ভিউ
কন্ট্রোলার অ্যাক্সেস ম্যানেজ করতে Devise before_action ফিল্টার দিয়ে থাকে:
before_action :authenticate_user!
Devise এবং Rails Strong Parameters
Strong parameters রিকোয়েস্ট প্যারামিটারকে অবজেক্টে মাস অ্যাসাইনমেন্ট রোধ করে। Devise এই ফাংশনালিটি মিরর করে — প্যারামিটার ডিক্লেয়ার করতে হয় Devise-স্পেসিফিক কন্ট্রোলার অ্যাকশনে:
sign_up— ডিফল্ট কী:email,password,password_confirmationsign_in— ডিফল্ট কী:email,passwordaccount_update— ডিফল্ট কী:email,current_password,password,password_confirmation
নতুন অথেনটিকেশন কী (যেমন username) যোগ করতে ApplicationController-এ before_action ফিল্টার ব্যবহার করুন।
এрэই অফ কী পারমিট করতে হলে (যেমন ফريل্যান্সার মার্কেটপ্লেসে "contractor" এবং "employer" রোল একসাথে), Devise স্যানিটাইজার কনফিগার করুন।
Devise Views কাস্টমাইজ করুন
Devise Rails engine হিসেবে বিল্ট হওয়ায় এর কম্পোনেন্টগুলো প্রি-প্যাকেজড। লগইন, সাইন আপ, পাসওয়ার্ড রিসেট ইত্যাদি ভিউ কাস্টমাইজ করতে হলে:
$ bundle exec rails g devise:views
ভিউগুলো app/views/devise-এ জেনারেট হবে।
উদাহরণ: রেজিস্ট্রেশন ভিউতে username ফিল্ড যোগ করা। মাইগ্রেশন চালিয়ে user টেবিলে কলাম যোগ করুন, তারপর ভিউ এডিট করুন।
শুধু কিছু ভিউ কাস্টমাইজ করতে চাইলে:
$ bundle exec rails g devise:views -v sessions registrations
Devise Controllers এবং Routes কাস্টমাইজ করুন
ভিউ কাস্টমাইজেশনই যথেষ্ট নয়। রিয়েল কাস্টমাইজেশনের জন্য কন্ট্রোলার এবং রুটে যেতে হয়।
উদাহরণ: প্রতিটি নতুন ইউজার রেজিস্ট্রেশনে অ্যাডমিনকে ইমেইল পাঠানো।
Devise::RegistrationsController-এর signup অ্যাকশন মডিফাই করতে হলে কন্ট্রোলার জেনারেট করুন:$ bundle exec rails g devise:controllers users- Routes ফাইলে Devise রুট মডিফাই করুন:
devise_for :users, controllers: { registrations: 'users/registrations' } - নতুন
Users::RegistrationsControllerএডিট করে অ্যাডমিনকে ইমেইল পাঠান।
পরবর্তী পর্ব: Devise-এর Advanced ব্যবহার
প্রথম পার্টে Devise gem-এর বেসিকস কভার করলাম — মডিউলস, ভিউ এবং কন্ট্রোলার কাস্টমাইজেশন। দ্বিতীয় পার্টে API অথেনটিকেশন এবং OmniAuth-এ গভীরে যাব।
তখন পর্যন্ত Happy coding!
P.S. Ruby Magic পোস্টগুলি প্রকাশ होते সাথে সাথে পেতে আমাদের Ruby Magic নিউজলেটার সাবস্ক্রাইব করুন!