X Enterprises
fastify-xauth-better

requireOrgRole(roles)

Returns a preHandler that enforces org-scoped role membership on request.organization.

requireOrgRole(roles)

Returns a preHandler middleware that checks request.organization.role against an allowed-roles list. This checks the user's org-scoped Member.role, not their global User.role. Must be preceded by requireOrg() so that request.organization is already populated.

Signature

instance.requireOrgRole(
  roles: string | string[]
): (request: FastifyRequest, reply: FastifyReply) => Promise<void>

Params

NameTypeRequiredDescription
rolesstring | string[]YesOne or more allowed org-scoped role values (matched against Member.role)

Returns

A preHandler function to pass to a route's preHandler option.

Throws

  • Throws Errorrequest.organization is not set (requireOrg() was not called first)
  • 403 Forbidden — user is not a member of the org, or their org role is not in the list

Examples

Restrict settings to org owners and admins

const userAuth = fastify.xauthbetter.get("user");

fastify.put("/orgs/:orgId/settings", {
  preHandler: [
    userAuth.requireAuth(),
    userAuth.requireOrg(),
    userAuth.requireOrgRole(["owner", "admin"]),
  ],
}, async (request) => {
  return { org: request.organization.id, updatedBy: request.user.id };
});

Single role — owner only

fastify.delete("/orgs/:orgId", {
  preHandler: [
    userAuth.requireAuth(),
    userAuth.requireOrg(),
    userAuth.requireOrgRole("owner"),
  ],
}, async (request) => {
  return { deleted: request.organization.id };
});

See also

AI Context

package: "@xenterprises/fastify-xauth-better"
method: fastify.xauthbetter.get(name).requireOrgRole(roles)
use-when: Fastify preHandler factory that enforces an org-scoped role — must be preceded by requireOrg()
usage: { preHandler: [auth.requireAuth(), auth.requireOrg(), auth.requireOrgRole(['owner'])] }
Copyright © 2026