я сделал так, есть действия, роли и пользователи. каждая роль содержит свой набор действий. каждый пользователь может обладать любым набором ролей. так же каждый пользователь может напрямую обладать разрешением или запретом на какое-то действие, то есть поверх того что ему по ролям дается. но это не обязательно. в инициализации проги составляется список действий которые доступны пользователю исходя из установленных связей. еще есть две дубовые роли, это гости и зарегистрированные пользователи. и есть специальный повсеместно доступный метод проверки доступа к действию. в методах требующих разрешения прописывается условие с проверкой, если действия нет в списке, то отдыхаем. так же эту проверку можно производить чтобы решить показывать ему элементы интерфейса вызывающие действия или нет. вкратце так