Concept Flow - Role-based access control
User sends request
Check user role
Role allowed?
No→Return 403 Forbidden
Yes
Allow access to resource
Send response
This flow shows how Flask checks a user's role before allowing access to a resource.
from flask import Flask, abort, request app = Flask(__name__) @app.route('/admin') def admin_panel(): if request.headers.get('Role') != 'admin': abort(403) return 'Welcome Admin!'
| Step | Request Role Header | Condition (Role == 'admin') | Action | Response |
|---|---|---|---|---|
| 1 | 'admin' | True | Allow access | 'Welcome Admin!' |
| 2 | 'user' | False | Abort with 403 | 403 Forbidden |
| 3 | None | False | Abort with 403 | 403 Forbidden |
| Variable | Start | After Step 1 | After Step 2 | After Step 3 |
|---|---|---|---|---|
| request.headers.get('Role') | None | 'admin' | 'user' | None |
| Condition (Role == 'admin') | False | True | False | False |
Role-based access control in Flask: - Check user role from request (e.g., headers) - If role matches allowed roles, proceed - Else abort with 403 Forbidden - Use abort(403) to block unauthorized access - Protect routes by role checks
@app.route('/dashboard')
@role_required('editor')
def dashboard():
return 'Welcome Editor'@app.route('/admin')
@role_required('admin')
def admin_panel():
return 'Admin Panel'/settings that only users with roles 'admin' or 'manager' can access. Which code snippet correctly implements this role-based access control?@app.route('/settings')
@role_required('admin')
@role_required('manager')
def settings():
return 'Settings Page' stacks decorators, which requires both roles simultaneously, not either/or.@app.route('/settings')
@role_required(['admin', 'manager'])
def settings():
return 'Settings Page' assumes role_required accepts list, which may not be supported by default.@app.route('/settings')
@role_required('admin' or 'manager')
def settings():
return 'Settings Page' uses 'admin' or 'manager' which evaluates to 'admin' always, incorrect.@app.route('/settings')
def settings():
if current_user.role in ['admin', 'manager']:
return 'Settings Page'
return 'Access Denied' manually checks if user role is in allowed list, correctly allowing either role.Pass the test and this pattern moves unknown