📖 Scenario: You are building a simple Express server for a company. Different users have different roles like 'admin' and 'user'. You want to control access to certain routes based on these roles.
🎯 Goal: Create a basic Express app that uses role-based access control (RBAC) middleware to allow or deny access to routes depending on the user's role.
📋 What You'll Learn
Create an Express app with a users data structure
Add a variable to hold the current user's role
Write middleware to check the user's role before allowing access
Protect routes so only users with the right role can access them
💡 Why This Matters
🌍 Real World
Role-based access control is used in web apps to restrict what users can do based on their roles, like admin or regular user.
💼 Career
Understanding RBAC is important for backend developers to secure APIs and protect sensitive data.
Progress0 / 4 steps
1
Set up users data
Create a constant called users that is an object with these exact entries: alice with role admin, bob with role user, and carol with role guest.
Express
Hint
Use an object with keys as usernames and values as objects with a role property.
2
Set current user role
Create a variable called currentUserRole and set it to the role of user bob from the users object.
Express
Hint
Access the role property of bob inside users.
3
Create role check middleware
Write a function called checkRole that takes a parameter role and returns a middleware function. This middleware should check if currentUserRole equals the role parameter. If yes, call next(). Otherwise, respond with status 403 and message 'Access denied'.
Express
Hint
Return a middleware function that compares currentUserRole with the given role.
4
Protect routes with middleware
Create an Express app using express(). Add two routes: /admin protected by checkRole('admin') middleware that sends 'Welcome Admin', and /user protected by checkRole('user') middleware that sends 'Welcome User'.
Express
Hint
Use app.get with the checkRole middleware and send the correct welcome messages.
Practice
(1/5)
1. What is the main purpose of role-based access control (RBAC) in an Express app?
easy
A. To speed up the server response time
B. To limit user actions based on their assigned roles
C. To store user passwords securely
D. To log all user activities automatically
Solution
Step 1: Understand RBAC concept
RBAC means controlling what users can do depending on their role, like admin or guest.
Step 2: Identify main purpose in Express
In Express, RBAC limits access to routes or actions based on user roles to keep the app safe.
Final Answer:
To limit user actions based on their assigned roles -> Option B
Quick Check:
RBAC controls user permissions = A [OK]
Hint: RBAC controls what users can do by role [OK]
Common Mistakes:
Confusing RBAC with performance optimization
Thinking RBAC stores passwords
Assuming RBAC logs activities automatically
2. Which of the following is the correct way to define a middleware function in Express to check if a user has the role 'admin'?
easy
A. function checkAdmin(req, res, next) { if(req.user.role === 'admin') next(); else res.status(403).send('Forbidden'); }
B. function checkAdmin(req, res) { if(req.user.role == 'admin') next(); else res.send('Forbidden'); }
C. function checkAdmin(req, res, next) { if(req.user.role = 'admin') next(); else res.status(403).send('Forbidden'); }
D. function checkAdmin(req, res, next) { if(req.user.role !== 'admin') next(); else res.status(403).send('Forbidden'); }
Solution
Step 1: Check middleware signature
Middleware must have three parameters: req, res, next.
Step 2: Verify role check and response
function checkAdmin(req, res, next) { if(req.user.role === 'admin') next(); else res.status(403).send('Forbidden'); } correctly compares role with 'admin' using === and calls next() if true; else sends 403 status.
Final Answer:
function checkAdmin(req, res, next) { if(req.user.role === 'admin') next(); else res.status(403).send('Forbidden'); } -> Option A
Quick Check:
Middleware with correct params and strict role check = D [OK]
Hint: Middleware needs (req, res, next) and strict role check [OK]
Common Mistakes:
Using assignment (=) instead of comparison (===)
Missing next() parameter or call
Wrong logic reversing role check
3. Given this Express route with role check middleware, what will be the response if a user with role 'user' tries to access it?
D. Using assignment (=) instead of comparison (===) in the if condition
Solution
Step 1: Check the if condition syntax
The condition uses single = which assigns 'admin' to req.user.role instead of comparing it.
Step 2: Understand impact of assignment in condition
Assignment always returns truthy, so else block never runs, causing wrong behavior.
Final Answer:
Using assignment (=) instead of comparison (===) in the if condition -> Option D
Quick Check:
Use === for comparison, not = [OK]
Hint: Use === for comparison, not = assignment [OK]
Common Mistakes:
Confusing assignment and comparison operators
Forgetting to call next() in middleware
Using wrong HTTP status codes
5. You want to protect multiple routes so only users with roles 'admin' or 'manager' can access them. Which middleware implementation correctly allows this in Express?
hard
A. function checkRoles(req, res, next) { if(req.user.role === 'admin' && req.user.role === 'manager') next(); else res.status(403).send('Forbidden'); }
B. function checkRoles(req, res, next) { if(req.user.role === 'admin' || 'manager') next(); else res.status(403).send('Forbidden'); }
C. function checkRoles(req, res, next) { if(['admin', 'manager'].includes(req.user.role)) next(); else res.status(403).send('Forbidden'); }
D. function checkRoles(req, res, next) { if(req.user.role == 'admin' || req.user.role == 'manager') next(); else res.status(404).send('Forbidden'); }
Solution
Step 1: Check role inclusion logic
function checkRoles(req, res, next) { if(['admin', 'manager'].includes(req.user.role)) next(); else res.status(403).send('Forbidden'); } uses array includes() to check if role is 'admin' or 'manager', which is correct and clean.
Step 2: Verify status code and logic correctness
Using && requires role to be both 'admin' and 'manager' simultaneously (impossible); condition like if(role === 'admin' || 'manager') has wrong syntax and always passes since 'manager' is truthy; using 404 instead of 403 for forbidden access is incorrect.
Final Answer:
function checkRoles(req, res, next) { if(['admin', 'manager'].includes(req.user.role)) next(); else res.status(403).send('Forbidden'); } -> Option C
Quick Check:
Use includes() for multiple roles and 403 status = C [OK]
Hint: Use array includes() to check multiple roles cleanly [OK]
Common Mistakes:
Using incorrect logical operators or syntax
Checking role equality incorrectly
Sending wrong HTTP status code for forbidden
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.