Assigning Roles to Users
This guide explains how to determine and pass the correct roles for each user in your application.
The Role Assignment Flow
You control role assignment entirely - DocBit AI just receives the roles you pass.
Mapping Strategies
1. Direct Mapping from User Groups
If your system has user groups, map them directly:
function getRolesFromGroups ( userGroups ) {
const roleMap = {
'Human Resources' : 'hr' ,
'Finance Team' : 'finance' ,
'Engineering' : 'engineering' ,
'All Employees' : 'all-staff'
};
return userGroups
. map ( group => roleMap [ group ])
. filter ( Boolean );
}
// User in "Human Resources" and "All Employees" groups
const roles = getRolesFromGroups ([ 'Human Resources' , 'All Employees' ]);
// Result: ['hr', 'all-staff']
2. Role Hierarchy
Build cumulative roles based on hierarchy:
function getRolesFromLevel ( level ) {
const hierarchy = {
'employee' : [ 'employee' ],
'manager' : [ 'employee' , 'manager' ],
'director' : [ 'employee' , 'manager' , 'director' ],
'executive' : [ 'employee' , 'manager' , 'director' , 'executive' ]
};
return hierarchy [ level ] || [ 'employee' ];
}
// A director gets all lower-level roles too
const roles = getRolesFromLevel ( 'director' );
// Result: ['employee', 'manager', 'director']
3. Attribute-Based Assignment
Derive roles from user attributes:
function getRolesFromUser ( user ) {
const roles = [ 'all-staff' ]; // Base role for everyone
// Department
if ( user . department ) {
roles . push ( user . department . toLowerCase ());
}
// Management level
if ( user . isManager ) roles . push ( 'manager' );
if ( user . isDirector ) roles . push ( 'director' );
if ( user . isExecutive ) roles . push ( 'executive' );
// Project memberships
if ( user . projects ) {
user . projects . forEach ( p => roles . push ( `project- ${ p } ` ));
}
// Special access
if ( user . hasConfidentialAccess ) roles . push ( 'confidential' );
return [ ... new Set ( roles )]; // Deduplicate
}
4. Claims from Identity Provider
Extract roles from JWT claims or IdP attributes:
// From JWT token claims
function getRolesFromToken ( decodedToken ) {
// Azure AD groups claim
const groups = decodedToken . groups || [];
// Custom roles claim
const customRoles = decodedToken [ 'extension_roles' ] || [];
// Combine and normalize
return [ ... groups , ... customRoles ]
. map ( r => r . toLowerCase (). replace ( / \s + / g , '-' ));
}
Integration Examples
Express.js Middleware
const express = require ( 'express' );
function DocBit AIMiddleware ( req , res , next ) {
const user = req . user ; // From your auth middleware
// Map your user to DocBit AI context
req . DocBit AI = {
orgId: user . tenantId ,
userId: user . id ,
roles: getRolesFromUser ( user )
};
next ();
}
app . use ( DocBit AIMiddleware );
app . post ( '/api/ask' , async ( req , res ) => {
const response = await DocBit AIClient . chat ({
headers: {
'X-External-Org-Id' : req . DocBit AI . orgId ,
'X-External-User-Id' : req . DocBit AI . userId ,
'X-External-Roles' : JSON . stringify ( req . DocBit AI . roles )
},
body: { message: req . body . question }
});
res . json ( response );
});
Python/FastAPI
from fastapi import Depends, Request
def get_docbit_context ( request : Request):
user = request.state.user # From your auth
roles = [ 'all-staff' ]
if user.department:
roles.append(user.department.lower())
if user.is_manager:
roles.append( 'manager' )
return {
'org_id' : user.tenant_id,
'user_id' : str (user.id),
'roles' : roles
}
@app.post ( '/ask' )
async def ask ( question : str , ctx = Depends(get_docbit_context)):
return await docbit_client.chat(
org_id = ctx[ 'org_id' ],
user_id = ctx[ 'user_id' ],
roles = ctx[ 'roles' ],
message = question
)
Dynamic Role Updates
Roles are evaluated per-request, so changes take effect immediately:
// User gets promoted to manager
await updateUser ( userId , { isManager: true });
// Next request automatically includes 'manager' role
// No need to update anything in DocBit AI
Security Considerations
Always determine roles server-side. Never trust roles passed from the client.
Do This
// Server-side: derive roles from authenticated user
app . post ( '/ask' , authMiddleware , ( req , res ) => {
const roles = getRolesFromUser ( req . user ); // Trusted source
// ...
});
Don’t Do This
// Never accept roles from the client!
app . post ( '/ask' , ( req , res ) => {
const roles = req . body . roles ; // DANGEROUS - user could pass any roles
// ...
});
Best Practices
Always include a base role
Give everyone at least one role (like all-staff) for company-wide documents.
Keep role names consistent
Use the same role names when uploading documents and assigning to users.
Log which roles are assigned to help debug access issues.
Test with different role combinations
Verify users see the right documents for their roles.
Next Steps