I am not sure this is the answer to your question.
Consider you have an abstract class User.
User type 1 with whatever privileges and rights is a child of user and
encapsulates all
its privileges and rights, and of course at run time you can query the objects
about its
privileges and rights and allow them to do whatever .
User type 2 with whatever privileges and rights is a child of User and
encapsulates all
its privileges and rights, and ……
You mentioned optimum.
My question is optimum for what, memory use, speed, maintainability, scalability
?
What I suggested would give X number of user types ( predefined, compile time ),
even
though you may have n number of people ( will vary, run time ) doing their
stuff.