Если вы найдете хорошее упакованное решение для модуля разрешений, я бы хотел увидеть его:)
Вообще говоря, встроенные поставщики безопасности останавливаются после части «идентификация» и «авторизация». После определения и авторизации для доступа к приложению вам нужно будет более точно настроить права доступа к страницам или функциям.
Уровень разрешений, который вы описываете, на самом деле достаточно продвинутый для реализации. Он отражает списки контроля доступа (ACL) в Windows. Хотя это кажется довольно простым, на самом деле его довольно сложно кодировать. Как только вы приступаете к его проектированию, вы обнаруживаете, что вам необходимо реализовать разрешение «запретить» переопределение, обрабатывать слияния разрешений многоуровневой группы, а затем иметь дело со «специальными» разрешениями и тому подобным. Затем вы сталкиваетесь с тем, что «разрешения на редактирование тоже подразумевают представление, и что мне делать, если у них нет вида, но есть надстройка»?
Это может быть настоящий беспорядок.
Прежде чем приступить к реализации разрешений на этом уровне сложности, я настоятельно рекомендую вам сделать шаг назад и посмотреть, сможете ли вы немного сгладить ваши разрешения и модель ролей / групп. Разве вы не можете просто сойти с того, что ваши роли БУДУТ разрешать? Например, роль для людей, которые могут редактировать, роль для людей, которые могут добавлять, роль для людей, которые могут просматривать ... и т. Д.
В большинстве приложений вам не требуется полная ACL-подобия гранулярности в системе разрешений.
После того как вы определили соответствующий уровень разрешений, в котором действительно нуждается ваше приложение, вам лучше всего развернуть набор пользовательских объектов для управления этими разрешениями. Я должен сказать, что никогда раньше не рассматривал возможность использования второго связанного поставщика ролей в качестве менеджера разрешений ... на самом деле это довольно блестящая идея. Но я все еще советую против этого. Поставщик ролей не был разработан для того, что вы пытаетесь сделать, и вам, вероятно, придется расширить и переопределить поведение по умолчанию настолько, что было бы проще и удобнее обслуживать, если бы вы использовали пользовательскую реализацию с нуля.