Role-based access control with RoleHandler
The helpers.RoleHandler function provides role-based access control by mapping roles to specific handler functions.
helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_READ_ADMIN: helpers.StandardRequestWrapper(adminGet),
constants.ROLE_ADMIN: helpers.StandardRequestWrapper(adminCreate),
})
Roles are defined as integer constants in descending order of privilege:
| Role | Value | Description |
|---|---|---|
ROLE_ADMIN |
100 | Full system administrator access |
ROLE_READ_ADMIN |
90 | Read-only administrator access |
ROLE_ANY_AUTHORIZED |
0 | Any authenticated user |
ROLE_UNAUTHORIZED |
-1 | Unauthenticated requests |
If a user's role doesn't exactly match a handler, the system checks lower-privilege handlers:
helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_READ_ADMIN: helpers.StandardRequestWrapper(adminGet),
constants.ROLE_ANY_AUTHORIZED: helpers.StandardRequestWrapper(authGet),
})
Examples:
ROLE_ADMIN (100) → Uses ROLE_READ_ADMIN handler (fallback)ROLE_READ_ADMIN (90) → Uses ROLE_READ_ADMIN handler (exact match)ROLE_ANY_AUTHORIZED (0) → Uses ROLE_ANY_AUTHORIZED handler (exact match)The RoleHandler automatically injects the session into the request context, making it available via:
userSession := helpers.GetReqSession(req)
Session Fields:
type Session struct {
User coremodel.Model // thin wrapper over session data if you only need the users ID, i.e. sessionObj.User.ID(), or used to save data so we can track who saved it.
LoadedUser any // fully loaded user from the database, dont access directly, use the helper.GetLoadedUser(req)
}
Full admin access required:
r.Post("/", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ADMIN: helpers.StandardRequestWrapper(adminCreate),
}))
r.Put("/{id}", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ADMIN: helpers.StandardRequestWrapper(adminUpdate),
}))
r.Delete("/{id}", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ADMIN: helpers.StandardRequestWrapper(adminDelete),
}))
Both full admins and read-only admins can access:
r.Get("/", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_READ_ADMIN: helpers.StandardRequestWrapper(adminIndex),
}))
r.Get("/{id}", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_READ_ADMIN: helpers.StandardRequestWrapper(adminGet),
}))
r.Get("/count", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_READ_ADMIN: helpers.StandardRequestWrapper(adminCount),
}))
Any authenticated user can access:
r.Get("/", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ANY_AUTHORIZED: helpers.StandardPublicRequestWrapper(authIndex),
}))
r.Get("/{id}", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ANY_AUTHORIZED: helpers.StandardPublicRequestWrapper(authGet),
}))
Different handlers for different roles on the same route:
r.Get("/{id}", helpers.RoleHandler(helpers.RoleHandlerMap{
constants.ROLE_ADMIN: helpers.StandardRequestWrapper(adminGetFull),
constants.ROLE_ANY_AUTHORIZED: helpers.StandardPublicRequestWrapper(authGetLimited),
}))
Example:
adminGetFullauthGetLimited