Recientemente me encontré en una situación en la que un usuario tenía algunos roles, que le otorgaban roles adicionales, y así sucesivamente.
Como no entendía de dónde venía un permiso en particular, escribí este código que obtiene un conjunto inicial de roles y los recorre recursivamente, teniendo en cuenta cualquier repetición.