У меня была такая же проблема, вот мое решение.
Каждый компонент пользовательского интерфейса имеет состояние включения / выключения (видимый / скрытый, включенный / отключенный, редактируемый / только для чтения), и состояние может быть связано с одним или несколькими разрешениями.
Например, кнопка редактирования может быть включена, если у пользователя есть разрешение РЕДАКТИРОВАТЬ, или отключена в противном случае.
Я создал класс связывателя, который связывает компонент пользовательского интерфейса с разрешением. Связыватель знает текущие разрешения пользователя (все разрешения) через шину событий, где набор разрешений отправляется с использованием события. Каждый раз, когда событие получено, средство связывания проверяет, есть ли разрешение или нет (альтернатива - использовать логическое значение для каждого разрешения) и применяет изменения к компоненту (например, включение или отключение его).
Шина событий является единственным соединением между всеми компонентами пользовательского интерфейса.
Используя Gin и некоторый вспомогательный класс, я получил нечто подобное для кода привязки:
FeatureBinder.bind(editButton, EDIT_PERMISSION);