এর আগে আমরা ইউজার কে প্রটেকশন রাউটে ঢুকার অনুমতি দিয়েছিলাম এতে সে অনেক রাউটে ঢুকতে পারবে কিন্তু কিছু কিছু সময় আমাদের ইউজার রোল ম্যানেজ করতে হবে যেমন অ্যাডমিন,স্টাফ ,রেজিস্টার করা ইউজার এর route সীমাবদ্ধ করে দিতে হবে তবেই আমাদের এই সিস্টেমটি একটি কমপ্লিট ম্যানেজমেন্ট সিস্টেম এ পরিণত হবে।
এজন্য আমাদের ইউজার মডেলে একটি ফিল্ড যোগ করতে হবে।
const userSchema= new Schema({
role: String, // 'admin', 'librarian', 'member'
});
আমরা এর আগে যখন ভেরিফাই টোকেন নিয়ে কাজ করেছি তখন request.user দ্বারা এক্সপ্রেসজেস এর রিকোয়েস্ট অবজেক্ট এ ভ্যালু সেট করেছি যার কারণে সব রাউটের রিকোয়েস্ট অবজেক্ট দ্বারা ওই ভালুকে এক্সেস করা যায় আমরা যদি আমাদের request অবজেক্ট এ লগইন করার সময় যখন টোকেন ভেরিফাই করি তখন request.user.role নামে আমাদের ইউজার এর রোলের ভ্যালু সেট করে দেই তাহলে পরবর্তীতে যেকোনো রাউটে আমরা request.user.role কে একসেস করে ভ্যালু পাবো এবং তার ভিত্তিতে middleware বানাতে পারবো।
// আগে verify টোকেন middleware এমন ছিল
try {
const decoded = jwt.verify(token, '123456789');
req.user = decoded; // Store the decoded user data in req.user
next();
} catch (error) {
res.status(400).json({ message: 'Invalid token' });
}
// পরিবর্তন করে নিচের মতো করবো
try {
const decoded = jwt.verify(token, '123456789');
req.user = decoded; // Store the decoded user data in req.user
// Fetch the user's role from the database and add it to req.user
User.findById(decoded._id, 'role', (err, user) => {
if (err) {
return res.status(500).json({ message: 'Error fetching user data.' });
}
req.user.role = user.role; // Add the user's role to req.user
next();
});
} catch (error) {
res.status(400).json({ message: 'Invalid token' });
}
ইউজার রোলের মিডলওয়ার বানাই
function isAdmin(req, res, next) {
if (req.user && req.user.role === 'admin') {
return next();
}
return res.status(403).json({ message: 'Access denied. Admin privileges required.' });
}
function isLibrarian(req, res, next) {
if (req.user && (req.user.role === 'admin' || req.user.role === 'librarian')) {
return next();
}
return res.status(403).json({ message: 'Access denied. Librarian or admin privileges required.' });
}
function isMember(req, res, next) {
if (req.user && (req.user.role === 'admin' || req.user.role === 'librarian' || req.user.role === 'member')) {
return next();
}
return res.status(403).json({ message: 'Access denied. Member, librarian, or admin privileges required.' });
}
module.exports = {verifyToken,isAdmin,isLibrarian,isMember};
নির্দিষ্ট রাউটে middleware সেট করি
const {verifyToken,isAdmin,isLibrarian,isMember} = require('./middleware');
// Example protected routes with role-based access control
router.get('/api/protected', verifyToken, (req, res) => {
res.json({ message: 'This is a protected route.' });
});
// Example protected routes with role-based access control
router.get('/api/admin', verifyToken, isAdmin, (req, res) => {
res.json({ message: 'This is an admin-only route.' });
});
router.get('/api/librarian', verifyToken, isLibrarian, (req, res) => {
res.json({ message: 'This is a librarian or admin route.' });
});
router.get('/api/member', verifyToken, isMember, (req, res) => {
res.json({ message: 'This is a member, librarian, or admin route.' });
});