Каков наилучший способ разрешить разные уровни доступа к полям пользовательского интерфейса на основе роли пользователя?Безопасность на уровне полей MVC
На некоторых экранах мы можем иметь поле, предназначенное только для чтения, для одной роли, скрытое для другого и редактируемое еще одной ролью. Многие ответы на подобные вопросы предполагали наличие разных ViewModels (и представлений?) Для каждой роли, содержащей только те свойства, которые вы хотите, чтобы пользователи в этой роли редактировались, но это связано с большим количеством дублирования. У нас должно быть 3 или 4 аналогичные виртуальные машины, с несколькими свойствами/Связывание атрибутов, отличных от них. Мы должны были бы обработать сопоставление этих разных моделей представлений с моделью в контроллере.
Это также означает, что пользователь хочет изменить разрешения для роли, необходимые для изменения кода.
В отличие от этого, в одном из наших проектов веб-форм у нас есть полная безопасность на уровне поля со всеми правилами, хранящимися в базе данных и применяемыми во время выполнения, поэтому изменение разрешений роли на элементе управления не требует каких-либо изменений кода.
Как мы можем реализовать это с помощью MVC?
Если с помощью MVC невозможно обеспечить безопасность на уровне поля, то каков наилучший способ реализовать защиту на уровне поля для разных ролей? Нам действительно нужны n копий каждой ViewModel и View?
Редактировать, чтобы добавить мы нашли this, который хранит разрешения для ролей в базе данных, но разрешения приложений по-прежнему определены в коде. Это вызывает метод контроллера в представлении: if (ViewContext.Controller.HasPermission("ViewRestrictedHRData"))
), но до сих пор выглядит лучшее решение, которое я видел
Просто, чтобы добавить нас к чему-то более настраиваемым во время выполнения, как с точки зрения которых роли, какими правами и добавив безопасность в любое поле на странице без необходимости добавлять код вокруг каждого поля в представлении.
Hi @Matt, вы нашли решение? Как вы сохраняете эти разрешения в своей БД? – FEST
Разрешения в базе данных описаны здесь http://www.codeproject.com/Articles/875547/Custom-Roles-Based-Access-Control-RBAC-in-ASP-NET?display=Print – Matt
В итоге я использовал ActionFilters, чтобы изменить модель до того, как она попадет в представление, а затем снова изменит ее на обратном пути до того, как она попадет на контроллер, используя правила безопасности, определенные в базе данных. Таким образом, вы можете определить в базе данных для моделей моделей тип Person, скрыть свойство FirstName для пользователей в роли X. – Matt