2015-08-18 3 views
2

Каков наилучший способ разрешить разные уровни доступа к полям пользовательского интерфейса на основе роли пользователя?Безопасность на уровне полей MVC

На некоторых экранах мы можем иметь поле, предназначенное только для чтения, для одной роли, скрытое для другого и редактируемое еще одной ролью. Многие ответы на подобные вопросы предполагали наличие разных ViewModels (и представлений?) Для каждой роли, содержащей только те свойства, которые вы хотите, чтобы пользователи в этой роли редактировались, но это связано с большим количеством дублирования. У нас должно быть 3 или 4 аналогичные виртуальные машины, с несколькими свойствами/Связывание атрибутов, отличных от них. Мы должны были бы обработать сопоставление этих разных моделей представлений с моделью в контроллере.

Это также означает, что пользователь хочет изменить разрешения для роли, необходимые для изменения кода.

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

Как мы можем реализовать это с помощью MVC?

Если с помощью MVC невозможно обеспечить безопасность на уровне поля, то каков наилучший способ реализовать защиту на уровне поля для разных ролей? Нам действительно нужны n копий каждой ViewModel и View?

Редактировать, чтобы добавить мы нашли this, который хранит разрешения для ролей в базе данных, но разрешения приложений по-прежнему определены в коде. Это вызывает метод контроллера в представлении: if (ViewContext.Controller.HasPermission("ViewRestrictedHRData"))), но до сих пор выглядит лучшее решение, которое я видел

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

+0

Hi @Matt, вы нашли решение? Как вы сохраняете эти разрешения в своей БД? – FEST

+0

Разрешения в базе данных описаны здесь http://www.codeproject.com/Articles/875547/Custom-Roles-Based-Access-Control-RBAC-in-ASP-NET?display=Print – Matt

+0

В итоге я использовал ActionFilters, чтобы изменить модель до того, как она попадет в представление, а затем снова изменит ее на обратном пути до того, как она попадет на контроллер, используя правила безопасности, определенные в базе данных. Таким образом, вы можете определить в базе данных для моделей моделей тип Person, скрыть свойство FirstName для пользователей в роли X. – Matt

ответ

1

Вы можете использовать синтаксис бритвы, чтобы проверить, находится ли пользователь в определенной роли.

@if(User.IsInRole("Administrator")) { 
    Html.TextBoxFor(...); 
} 
+0

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

Смежные вопросы