Никогда не писал на FastAPI, но наверняка в нём подходы не сильно отличаются от любых других фреймворков. Можно добавить в токен список ролей пользователя на момент выдачи токена, а проверку ролей сделать декоратором на обработчиках запросов, типа
@app.get("/some/endpoint")
@has_role("some-role")
def some_handler(...):
...
Если хочется динамически менять роли на эндпоинте, то можно проверку делать в какой-нибудь там middleware и походы в БД за списком ролей и соответствием ролей эндпоинтам просто кэшировать. Обычно эндпоинтов и ролей не сотни, так что даже их комбинации много памяти не сожрут.